Вопрос о синтаксисе 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) так же, как, например, "кладет".

По соглашению этот метод обычно является конструктором для класса с тем же именем.

Другие вопросы по тегам