Интернет магазин китайских планшетных компьютеров



Компьютеры - Ruby - Примеры

14 мая 2011


Оглавление:
1. Ruby
2. Хронология выхода версий
3. Философия
4. Семантика
5. Возможности Ruby
6. Примеры
7. Реализация
8. Поддержка IDE
9. Библиотеки



В Ruby есть немало оригинальных решений, редко или вообще не встречающихся в распространённых языках программирования. Можно добавлять методы не только в любые классы, но и в любые объекты. Например, вы можете добавить к некоторой строке произвольный метод.

                   # всё от символа # и до конца строки - комментарий
                   # = является оператором присваивания,
                   # символы в «"» - строка, которой можно манипулировать средствами языка
  str = "Привет"   # здесь создаётся переменная str, типа String
                   # def - ключевое слово для объявления функции
  def str.bye      # str. указывает, кому принадлежит метод
                   # bye - имя метода, за ним может следовать необязательный, заключённый в
                   # круглые скобки список параметров функции
    "Пока!"        # из метода возвращается последнее вычисленное значение
  end              # ключевым словом end заканчиваются практически все инструкции Ruby
                   # puts - метод,
                   # str.bye - обращение к методу bye объекта str
                   # значение, полученное из метода bye передаётся методу puts
                   # который выводит на экран информацию
  puts str.bye     #=> Пока!

Этот пример также демонстрирует, как в Ruby можно использовать синглтон. В этом примере синглтоном является объект str.

Любая конструкция в Ruby возвращает значение. Например:

                   # конструкция if вычисляет выражение после него, и, если оно истинно,
                   # возвращает результат выражения между then и else, иначе между else и end
  puts   #=> Одно
                   # происходит присваивание значения переменной var, и операция присваивания
                   # возвращает значение переменной var, которая выводится на экран
  puts                                  #=> 5

Контейнеры

Работа с массивами — одна из сильных сторон Ruby. Они автоматически изменяют размер, могут содержать любые элементы, и язык предоставляет мощные средства для их обработки.

                           # создаём массив
 a =  * 3]
                           # =>]
                           # обращение по индексу
 a                      # => 3.14
                           # «разворачиваем» все внутренние массивы, удаляем одинаковые элементы
 a.flatten.uniq            # =>
                           # пытаемся найти индекс элемента со значением 4
 a.index                # => nil
                           # предыдущая попытка найти элемент неудачна - все предыдущие функции
                           # возвращают копии, но Ruby почти для всех функций предоставляется
                           # аналог с тем же названием, но заканчивающийся на «!»,
                           # который модифицирует контейнер
 a.flatten!                # =>
 a.index                # => 5

Процедурные объекты и итераторы

В языке есть 2 эквивалентных способа записи блоков кода:

 { puts "Hello, World!" }
 
 do puts "Hello, World!" end

Сопрограммы применяются с большинством встроенных методов:

 File.open {|file| # открытие файла «file.txt» для записи
   file.puts 'Wrote some text.'
 } # Конструкция устраняет неопределённость с закрытием файла: закрывается здесь при любом исходе

Следующий пример показывает использование сопрограмм и итераторов для работы с массивами, который показывает краткость записи на Ruby многих достаточно сложных действий:

# для работы требуется ruby 1.9
.collect{|v| v ** 2 }.select{ rand.zero? }.map.with_index {|*v| v }

Классы, примеси, методы, перегрузка операторов

Следующий пример определяет класс с именем Person, предназначенный для хранения информации об имени и возрасте некоторой персоны.

 class Person                # объявление класса начинается с ключевого слова class, за которым
                             # следует имя
   include Comparable        # подмешивается к классу
                             # и добавляет методы <, <=, ==, >=, > и between?
                             # с использованием нижеопределённого
                             # в классе <=>
                             #
   @@count_obj = 0           # переменная класса для подсчёта числа созданных объектов
                             #
                             # конструктор для создания объектов с помощью new
   def initialize # name, age - параметры метода
                             # название переменных объекта начинается с @
     @name, @age = name, age # создаём объекты и увеличиваем счётчик на 1
     @@count_obj += 1
   end
 
   def <=>           # переопределение оператора <=>
                             #
     @age <=> person.age     # из метода возвращается последнее вычисленное выражение,
   end
 
   def to_s                  # для форматированного вывода информации puts
     "#{@name}"    # конструкция #{x} в 2-х кавычках замещается в Ruby значением x
   end
 
   def inspect               # похож на to_s, но используется для диагностического вывода
     "<#{@@count_obj}:#{to_s}>"
   end
                             # пример метапрограммирования: добавляет методы для доступа к
                             # переменным объекта
   attr_reader :name, :age
 end
                             # создаём массив объектов
 group = [ Person.new,
          Person.new,
          Person.new ]
                      # =>
                      # здесь при работе с irb автоматически вызывается метод inspect
                      # вызываем методы массива сортировка и разворачивание его в обратном порядке
 puts group.sort.reverse # Печатает:
                         # Markus
                         # John
                         # Ash
                                    # обращаемся к функции, которая была добавлена
                                    # автоматически при включении Comparable
 group.between? # => true

Исключения

Исключения возбуждаются с помощью конструкции raise, опционально могут быть добавлены текст с сообщением, тип исключения и информация о стеке вызовов:

 raise ArgumentError, "Неверный аргумент", caller # caller - метод, возвращающий текущий стек выполнения

Обрабатываются исключения с использованием конструкции rescue. Опционально можно указать тип обрабатываемого исключения и получение информации. Также можно добавлять блоки else и ensure.

 begin
   # ...
 rescue RuntimeError => e
   # обрабатываем конкретный тип ошибок
   puts e # напечатаем сообщение об ошибке
 rescue
   # можно писать rescue => e чтобы получить объект исключения
   # обрабатываем все исключения
 else
   # сработает, если исключений не было
 ensure
   # сработает в любом случае
 end


Просмотров: 9819


<<< Phalanger
SCGI >>>