Вопрос о синтаксисе Ruby: Rational (a, b) и Rational.new! (A, b) - PullRequest
6 голосов
/ 27 октября 2010

Сегодня я наткнулся на странный синтаксис ruby ​​в классе Rational :

Rational(a,b)

(обратите внимание на отсутствие части .new() по сравнению с обычным синтаксисом Ruby). Что это значит точно по сравнению с обычным синтаксисом new? Что еще более важно, как я могу реализовать что-то подобное в своем собственном коде, и почему я должен реализовать что-то подобное? В частности, для класса Rational, почему этот синтаксис используется вместо обычного создания экземпляра? И почему метод new закрыт в рациональном классе? (И как / почему я сделал бы это в своем собственном рубиновом коде?) Заранее благодарен за ваши ответы, тем более что я задал так много вопросов.

Ответы [ 2 ]

6 голосов
/ 27 октября 2010

Все, что вам нужно сделать, это объявить глобальную функцию с тем же именем, что и ваш класс. И вот что делает рациональный. 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() и т. Д. легко реализовать и понять.

3 голосов
/ 27 октября 2010

Метод Rational () фактически является методом экземпляра, определенным вне класса Rational.Следовательно, он становится методом экземпляра любого объекта, который загружает библиотеку «рациональная» (обычно main: Object) так же, как это делает «put», например.

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

...