respond_to?
方法作为参数,一个要检查的方法,但作为符号。
为什么作为符号? ruby如何将方法转换为符号?
答案 0 :(得分:5)
没有魔力。方法通过名称附加到对象上,这是一个符号。实际上,Math.sin(2)
基本上是Math.send(:sin, 2)
的简写("将消息:sin
发送到Math
对象,参数2
") 。您也可以自行访问方法:Math.method(:sin)
会为您提供关联的Method
对象(其名称Math.method(:sin).name
,当然是:sin
),Math.methods
将会列出所有实施的方法'名。 Math.respond_to?(:sin)
基本上可以重写为Math.methods.include?(:sin)
(这是简化的,因为它忽略respond_to_missing?
,但......足够接近此讨论。)
这样想。你去了朋友的家,他们的母亲回答了门。你问,"你好,蒂姆在这儿吗?"你不需要把你的朋友拖到门口然后问问你好,这个人在这里吗?"这个名字也适用。 :)
编辑:
嗯,现在对我来说很困惑。名字究竟意味着什么?我的意思可能是一个小例子。我用array.each调用它。 "什么时候命名" :每个人都进场了吗?
我不确定如何更好地解释它。方法有名字,就像人们有名字一样。当您说array.each
时,它会将消息:each
发送到变量array
中包含的对象,这正是array.send(:each)
所做的。方法是通过名称附加到对象的代码片段:当对象接收消息时,它运行与该消息关联的代码片段。
具体来说,在标准的Ruby实现中,类Array
的对象在收到消息:each
时会调用Ruby源代码中定义的C函数rb_ary_each
,并使用:each
(也在Ruby源代码中)链接到消息rb_define_method(rb_cArray, "each", rb_ary_each, 0)
。
在Ruby中,基本上有两种定义方法的方法。这两个是等价的:
class Foo
def bar
puts "hello"
end
end
class Foo
define_method(:bar) do
puts "hello"
end
end
他们都做同样的事情:将消息:bar
与代码段do puts "hello" end
相关联。当:bar
收到Foo
时(无论是通过Foo.send(:bar)
还是Foo.bar
),这段代码就会运行。