作者:手浪用户2602922465 | 来源:互联网 | 2023-02-04 14:18
该respond_to?
方法将参数作为参数,要检查的方法,但作为符号.
为什么作为符号?ruby如何将方法转换为符号?
1> Amadan..:
没有魔力.方法通过名称附加到对象上,这是一个符号.实际上,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
时将调用rb_ary_each
Ruby源代码中定义的C函数,并:each
使用rb_define_method(rb_cArray, "each", rb_ary_each, 0)
(也在Ruby源代码中)链接到消息.
在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
a Foo
(无论是通过Foo.send(:bar)
还是通过Foo.bar
)接收到时,运行这段代码.
@ Md.FarhanMemon在某种程度上,你是对的.大多数方法处理函数都将名称作为字符串和符号接受.`Math.method("sin")`返回与`Math.method(:sin)`相同的结果.就Ruby而言,符号和字符串是不同的东西,但这些函数同时处理两者,就像HWIA一样.但是说HWIA在这里扮演一个角色,因为这种类似的行为就像说汽车在银行保险柜中起作用,因为他们都使用钥匙.:)