почему метод ruby ​​имеет себя как метод - PullRequest
5 голосов
/ 30 апреля 2011
def moo
   puts "moo"
end

moo.moo.moo.moo

это дает

moo
moo
moo
moo

просто странность, мне было любопытно, если это было сделано специально и служило какой-то цели ...

Ответы [ 4 ]

5 голосов
/ 30 апреля 2011

Я предполагаю, что вы делаете это в консоли, поэтому вы на самом деле определяете метод для Object, который затем определяет метод для всех дочерних элементов Object ... и это все.Итак, ваш метод:

def moo
  puts "moo"
end

Возвращает nil, и, поскольку вы определили метод для Object, NilClass также имеет метод, поэтому вы можете вызвать moo для NilClass.

Если вы сделаете:

class Foo
  def bar
    1 + 1
  end
end

А потом:

f = Foo.new
f.bar.bar

Вы получите:

NoMethodError: undefined method `bar' for 2:Fixnum
1 голос
/ 30 апреля 2011

Возможно, вы что-то определяете в классе Object. Поскольку все в Ruby является Object и каждый метод возвращает что-то (по умолчанию nil), вы можете вызвать этот метод для его собственного результата. Метод moo возвращает nil, поэтому вы вызываете moo сначала для глобального объекта, а затем для каждого возвращаемого nil.

Вы можете сделать это более явно:

class Object
  def moo
    puts 'moo'
  end
end

Если вы обычно хотите объединить методы, вы можете попробовать это:

class Mooer
  def moo
    puts 'moo'
    self
  end
end

a = Mooer.new
a.moo.moo.moo.moo.inspect
0 голосов
/ 30 апреля 2011

Это не должно работать.

Вы определяете moo как метод для основного объекта.Вызов moo должен работать, но ваш метод возвращает nil (потому что put возвращает nil).Вы не определили NilClass # moo, поэтому moo.moo должен потерпеть неудачу, и это для меня.

0 голосов
/ 30 апреля 2011

puts "moo" возвращает nil. Метод из области может быть использован в любой области ниже. Поскольку moo находится в верхней области видимости, все объекты могут вызывать его:

"teste".moo # => prints "moo"

Если вы не хотите этого, сделайте moo приватным:

private :moo
moo # => ok
nil.moo # => NoMethodError
moo.moo # => prints once and raise NoMethodError
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...