理解Ruby方法#call

时间:2013-02-24 04:26:01

标签: ruby

def test
  "Hello World"
end

p method(:test).call  #"Hello World"
p method("test").call #"Hello World"

我的问题是:当我们将符号传递给call方法时会发生什么? ruby会将符号转换为String然后执行吗?如果是这样,那么它的目的是什么?

如果没有,那么实际发生了什么? 你能详细说明吗? 对不起,如果我没有说清楚。

1 个答案:

答案 0 :(得分:14)

当您在任何显式类或模块定义之外执行def test ...时,您基本上处于Object类上下文中,因此test现在是Object的实例方法

irb ...

1.8.7 :001 > def test
1.8.7 :002?>   "Hello world"
1.8.7 :003?>   end
 => nil
1.8.7 :004 > Object.instance_methods.sort
 => ["==", "===", "=~", "__id__", "__send__", "class", "clone", "display", "dup", "enum_for", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "inspect", "instance_eval", "instance_exec", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "methods", "nil?", "object_id", "private_methods", "protected_methods", "public_methods", "respond_to?", "send", "singleton_methods", "taint", "tainted?", "tap", "test", "to_a", "to_enum", "to_s", "type", "untaint"]

methodObject类的实例方法,它基本上都是由所有内容继承的。当您在任何显式类或模块定义之外调用method时,您基本上将其作为Object类的方法调用,并且该类本身是Class的实例,这是Object的子类(对不起 - 我知道这有点令人困惑)。

所以 - method方法接受一个字符串或一个符号,并在调用.method的同一对象上返回一个封装该名称的绑定方法的对象。在这种情况下,这是绑定到test对象的Object方法。

method(:test).call表示调用test的{​​{1}}方法,这是您之前通过Object定义的方法。