Ruby中"方法"方法的意义何在?

Lef*_*_19 5 ruby

在Ruby中,有一个"方法"方法,它创建一个方法对象,然后可以将其视为Proc.如果您想进行元编程,这非常有用:

def foobar(method_as_a_string)
   2.method(method_as_a_string).call(2)
end

foobar("+")
=> 4

foobar("-")
=> 0
Run Code Online (Sandbox Code Playgroud)

但是,通常情况下,如果你想进行这样的元编程,你会使用send而不是方法......

def foobar(method_as_a_string)
   2.send(method_as_a_string, 2)
end

foobar("+")
=> 4

foobar("-")
=> 0
Run Code Online (Sandbox Code Playgroud)

那么Ruby中的"方法"方法有什么意义呢?

cor*_*ard 6

一个Method对象提供了各种反省和元编程,包括:

  1. 获取方法的arity或参数
  2. 获取方法的源代码位置,这在调试或编写交互或检查正在运行的应用程序源的工具时很有用
  3. 获得方法的接收者

你如何以及如何使用这些权力取决于你.


对于卡里,下面:

"cat".method(:count).receiver
# => "cat"
Run Code Online (Sandbox Code Playgroud)


max*_*ner 6

您可以将method结果传递给块,它将调用传递iteratee 作为参数的方法.

例如,这不起作用:

[1,2,3].each(&:puts)
Run Code Online (Sandbox Code Playgroud)

因为它正在调用1.puts,2.puts等等.但这会:

[1,2,3].each(&method(:puts))
Run Code Online (Sandbox Code Playgroud)

另一个例子:

arr, result = [1,2,3], []
arr.each &result.method(:push)
result # => [1,2,3]
Run Code Online (Sandbox Code Playgroud)