Ruby如何将方法转换为符号作为参数?

时间:2017-05-09 08:04:52

标签: ruby

respond_to?方法作为参数,一个要检查的方法,但作为符号。

为什么作为符号? ruby如何将方法转换为符号?

1 个答案:

答案 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),这段代码就会运行。