Другие не менее занимательные вещи в Ruby

Getters & Setters

Для генерации getters and setters, заведены шорткаты, позволяющие избавиться от самих методов внутри кода. Рассмотрим подробнее на примере.
Шорткат следующего вида

attr_reader :myField

Равнозначен

def myField
    @myField
end //getter для myField

Собственно это геттер для переменной экземпляра класса (instance variable) “myField”. Филды объявляются с одним символом @ (at) в начале переменной и с маленькой буквы.

Раз уж разговор зашел о переменных, отметим еще несколько.

Глобальные переменные. Глабальные переменные объявляются с симоволом $ в начале. Глобальные переменные доступны из любого места программы.

Переменные класса. Переменные класса объявляются с двойным символом @@ в начале имени переменной. Переменные класса (class variables) – итересная штука, похожа на глобальную переменную, но только в пределах класса. Т.е. значение этой переменной распространяется на все экземпляры класса.

Далее:

attr_writer :myField

Равнозначно

def myField=(value)
    @myField=value
end //setter для myField

Если хочется объявить сразу геттер и сеттер, то используется след. шорткат

attr_accessor :myField

При этом совершенно нет необходимости объялять эти переменные в начале класса, это будет сделано автоматически компилятором. Опять же существенно сокращается объем кода – нет необходимости в описании всех методов доступа.

Singleton.

Стало интересно как реализуется этот паттерн.

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

На самом же деле все оказалось очень просто (для использования) и только потому, что кто-то уже позаботился об этом и включил в библиотеку классов.

    require 'singleton'
    class MyClass
      include Singleton //mix in
    end

Вот и все.

    a = MyClass.instance    »  #
    b = MyClass.instance    »  #

Modules.

С модулями еще все проще. Они используются в двух основных случаях. Первый как способ организации взаимосвязанных методов и констант в одном месте (пример Math модуль). Второй – создание мих-инов (mix -in).

А теперь вопрос. Как объявляются статические методы класса?
Единственное решение которое я знаю сейчас:

    module B
      module_function
      def sum(x,y)
        x+y
      end
    end

Таким образом я могу это использовать так:

    require 'B'
    puts B.sum (3,2)
Advertisements