Жаргон Ruby

Заново начинать учить английский для освоения Ruby необязательно. Не
нужно знать кое-какие жаргонные выражения, обычные в сообществе. Некоторьк
из них имеют другой смысл, чем принято в компьютерном мире. Им и посвяще!
настоящий раздел В Ruby термин «атрибут» носит неофициальный характер. Можно считать,
что атрибут - это переменная экземпляра, которая раскрывается внешнему миру
с помощью одного из методов семейства attr. Но тут нет полной определенности:
могут существовать методы foo и foo=, не соответствующие переменной Sfoo, как
можно было бы ожидать. И, конечно, не все переменные экземпляра считаются атрибутами.
Как обычно, нужно придерживаться здравого смысла.
Атрибуты в Ruby можно подразделить на методы чтения (reader) и установки
(writer). Метод доступа, или акцессор (accessor), является одновременно методом чтения и установки. Это согласуется с названием метода attr_accessor, но противоречит принятой в других сообществах семантике, согласно которой акцессор дает доступ только для чтения.
Оператор === имеется только в Ruby (насколько мне известно). Обыкновенно
он называется оператором ветвящегося равенства (case equality operator), пос-
•ольку неявно используется в предложениях case. Но это название, как я уже говорил,
не вполне точно, потому что речь идет не только о «равенстве». В данной книге
я часто употребляю термин «оператор отношения» (relationship operator). Изобрел его не я, но проследить происхождение мне не удалось, к тому же он употребляется нечасто. Жаргонное название - «оператор тройного равенства» (threequal operator) или просто «три равно».
Оператор <=>, наверное, лучше всего называть оператором сравнения. На жаргоне
его называют космическим оператором (spaceship operator), поскольку он напоминает летающую тарелку - так ее изображали в старых видеоиграх.
Термин «поэтический режим» (poetry mode) подчеркивает, что можно опус-
жать ненужные знаки препинания и лексемы (насмешливый намек на отношение
иоэтов к пунктуации на протяжении последних шестидесяти лет). Поэтический
режим также часто означает «опускание скобок при вызове метода».
some_jnethod(1, 2, 3) # Избыточные.скобки.
some_method 1, 2, 3 # "Поэтический режим".
Но мне этот принцип представляется более общим. Например, когда хэш перелается
в качестве последнего или единственного параметра, можно опускать фигурные
скобки. В конце строки можно не ставить точку с запятой (а потому никто
этого и не делает). В большинстве случаев разрешается опускать ключевое слово
then в предложениях if и case.
Некоторые программисты заходят еще дальше, опуская скобки даже в определении
методов, но большинство так не поступает:
def my_method(a, b, с) # Можно и так: def my_method a, b, с
# ...
end
Стоит отметить, что в некоторых случаях сложность грамматики Ruby приводит
к сбоям анализатора. Во вложенных вызовах методов скобки для ясности лучше
оставлять. Иногда в текущей версии Ruby выводятся предупреждения:
def alpha(х)
х*2
end
def beta(у)
у*3
end
30 то же, что alpha(beta(gamma))
gamma = 5
delta = alpha beta gamma #
# Выдается предупреждение:
# warning: parenthesize argument(s) for future version
# предупреждение: заключайте аргумент(ы) в скобки для совместимости
# с будущими версиями
Термин duck typing («утиная типизация» или просто «утилизация»),насколько я знаю, принадлежит Дейву Томасу (Dave Thomas) и восходит к поговорке:ли кто-то выглядит как утка, ковыляет как утка и крякает как утка, то, наверное это и есть утка». Точный смысл термина «утилизация» - тема для дискуссий,мне кажется, что это намек на тенденцию Ruby заботиться не столько о точном классе объекта, сколько о том, какие методы для него можно вызывать и какие операции рации над ним можно выполнять. В Ruby мы редко пользуемся методом is_a? или kind_of, зато гораздо чаще прибегаем к методу respond_to?. Обычное дело - про то передать объект методу, зная, что при неправильном использовании будет во
буждено исключение. Так оно рано или поздно и случается.
Унарную звездочку, которая служит для расширения массива, можно было б
назвать оператором расширения массива, но не думаю, что кто-нибудь слышал т
кое выражение. В хакерских кругах ходят словечки «звездочка» (star) и «расшп
щивание» (splat), а также производные определения - «расплющенный» (splatte<
и «сплющенный» (unsplatted). Дэвид Алан Блэк придумал остроумное назван)
«унарный оператор линеаризации» (unary unarray operator)*.
Термин синглет (singleton) многие считают перегруженным. Это вполне обычш
английское слово, означающее вещь, существующую в единственном экземпляре. П
ка мы используем его в качестве модификатора, никакой путаницы не возникает.
Но Singleton (Одиночка) - это еще и хорошо известный паттерн проектиров;
ния, относящийся к классу, для которого может существовать лишь один объек
В Ruby для реализации этого паттерна имеется библиотека singleton.
Синглетный класс (singleton class) в Ruby - подобная классу сущность, мет<
ды которой хранятся на уровне объекта, а не класса. Пожалуй, это не «настоящи
класс», потому что его нельзя инстанцировать. Ниже приведен пример открыта
синглетного класса для строкового объекта с последующим добавлением метод
str = "hello"
# Альтернатива:
# def str.hyphenated
class « str
def hyphenated
self.split(""
end
end

str.hyphenated # "h-e-l-l-o
Кто-то предложил использовать термин eigenclass (класс в себе) - производное
от немецкого слова eigen (свой собственный), коррелирующее с термином
«собственное значение» (eigenvalue), применяемым в математике и физике. Остроумно,
но в сообществе не прижилось и некоторым активно не нравится.
Вернемся к предыдущему примеру. Поскольку метод hyphenate не существует
ни в каком-либо другом объекте, ни в классе, это синглетный метод данного объекта.
Это не вызывает неоднозначности. Иногда сам объект называется синглет-
ным, поскольку он единственный в своем роде - больше ни у кого такого метода
нет.
Однако вспомним, что в Ruby сам класс является объектом. Поэтому мы можем
добавить метод в синглетный класс класса, и этот метод будет уникален для
объекта, который - по чистой случайности - оказался классом. Пример:
class MyClass
class « self # Альтернатива: def self.hello
def hello # или: def MyClass.hello
puts "Привет от #{self}!"
end
end
end
Поэтому необязательно создавать объект класса MyClass для вызова этого метода.
MyClass.hello # Привет от MyClass!
Впрочем, вы, наверное, заметили, что это не что иное, как метод класса в Ruby.
Иными словами, метод класса - синглетный метод объекта-класса. Можно также /
сказать, что это синглетный метод, определенный для объекта, который случайно
оказался классом.
Осталась еще парочка терминов. Переменная класса - это, разумеется, то, имя
чего начинается с двух символов @. Возможно, название неудачно из-за нетривиального поведения относительно наследования. Переменная экземпляра класса - нечто совсем иное. Это обычная переменная экземпляра; только объект, которому
она принадлежит, является классом. Дополнительную информацию по этой теме
вы найдете в главе 11.