为什么ruby方法本身就是方法

时间:2011-04-29 20:46:08

标签: ruby

def moo
   puts "moo"
end

moo.moo.moo.moo

这给出了

moo
moo
moo
moo
只是一个奇怪的事情,我很好奇,如果这是故意的,并且有用的目的......

4 个答案:

答案 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应该失败,并为我做。