def moo
puts "moo"
end
moo.moo.moo.moo
这给出了
moo
moo
moo
moo
只是一个奇怪的事情,我很好奇,如果这是故意的,并且有用的目的......
答案 0 :(得分:5)
我猜你是在控制台中这样做的,所以你实际上是在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 :(得分:1)
也许你在Object
课上定义了一些东西。因为Ruby中的所有内容都是Object
,并且每个方法都返回一些内容(默认为nil
),所以您可以根据自己的结果调用该方法。 moo
方法返回nil
,所以您正在做的是首先在全局对象上调用moo
,然后在返回的每个nil
上调用。{/ p>
您可以更明确地执行此操作:
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
答案 2 :(得分:0)
puts "moo"
返回nil
。范围内的方法可用于以下任何范围。由于moo
位于顶部范围内,所有对象都可以调用它:
"teste".moo # => prints "moo"
如果您不想这样,请将moo
设为私有:
private :moo
moo # => ok
nil.moo # => NoMethodError
moo.moo # => prints once and raise NoMethodError
答案 3 :(得分:0)
这应该不起作用。
您将moo定义为'main'对象的方法。然后调用moo应该可以工作,但是你的方法返回nil(因为puts返回nil)。你没有定义NilClass#moo,所以moo.moo应该失败,并为我做。