Вопрос о синтаксисе Ruby: Rational(a, b) и Rational.new!(A, b)
Сегодня я наткнулся на странный синтаксис ruby в классе Rational:
Rational(a,b)
(Обратите внимание на отсутствие .new()
порция по сравнению с обычным синтаксисом Ruby). Что это значит, точно, по сравнению с нормой new
синтаксис? Что еще более важно, как я могу реализовать что-то подобное в своем собственном коде, и почему я должен реализовать что-то подобное? Специально для Rational
класс, почему этот синтаксис используется вместо обычной реализации? И почему new
метод частный в рациональном классе? (И как / почему я должен делать это в своем собственном рубиновом коде?) Заранее спасибо за ваши ответы, тем более что я задал так много вопросов.
2 ответа
Все, что вам нужно сделать, это объявить глобальную функцию с тем же именем, что и ваш класс. И вот что делает рациональный. Rb:
def Rational(a, b = 1)
if a.kind_of?(Rational) && b == 1
a
else
Rational.reduce(a, b)
end
end
сделать конструктор приватным:
private :initialize
и аналогично для new
метод:
private_class_method :new
Я полагаю Rational.new
может быть публичным и сделано, чтобы делать то, что Rational()
делает, но наличие метода, который превращает свои аргументы в экземпляры, согласуется с Array()
, String()
и т.д. Это знакомый шаблон, который легко реализовать и понять.
Метод Rational() фактически является методом экземпляра, определенным вне класса Rational. Следовательно, он становится методом экземпляра любого объекта, который загружает библиотеку "рациональная" (обычно main:Object) так же, как, например, "кладет".
По соглашению этот метод обычно является конструктором для класса с тем же именем.