Ruby中“方法”方法的意义何在?

时间:2017-01-30 16:17:26

标签: ruby

在Ruby中,有一个“方法”方法,它创建一个方法对象,然后可以将其视为Proc。如果你想进行元编程,这很有用:

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

foobar("+")
=> 4

foobar("-")
=> 0

但是,通常情况下,如果你想进行这样的元编程,你可以使用send代替方法......

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

foobar("+")
=> 4

foobar("-")
=> 0

Ruby中的“方法”方法有什么意义?

4 个答案:

答案 0 :(得分:6)

Method对象提供各种内省和元编程,包括:

  1. 获取方法的arity或参数
  2. 获取方法的源代码位置,这在调试或编写交互或检查正在运行的应用程序源的工具时非常有用
  3. 获取方法的接收者
  4. 你如何以及使用这些权力取决于你。

    对于卡里,下面:

    "cat".method(:count).receiver
    # => "cat"
    

答案 1 :(得分:5)

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

例如,这不起作用:

[1,2,3].each(&:puts)

因为它正在调用1.puts2.puts等。但这会:

[1,2,3].each(&method(:puts))

另一个例子:

arr, result = [1,2,3], []
arr.each &result.method(:push)
result # => [1,2,3]

答案 2 :(得分:3)

元编程还有其他方面,而不仅仅是直接使用方法。我最近写了一些代码,需要确定一个方法实际定义在哪个类中。

这是一个简单的例子:

class Foo
  def bar
    puts "bar"
  end
end

# to get the owner of bar method here
Foo.new.method(:bar).owner

我正在处理许多类扩展单个类的场景,在该单个类中,我需要知道为跟踪目的定义了哪个方法。我在Rails应用程序中为每个方法在before_filter中写了这个。

这是我唯一一次直接需要#method。

答案 3 :(得分:3)

我经常在寻找文档时使用它。

举个例子:

[1, 2, 3, 4, 5, 6].slice_after{|x| x.odd? }

接收器是一个数组,但Array doc中没有slice_after

这意味着slice_after定义在:

Array.ancestors
#=> [Array, Enumerable, Object, Kernel, BasicObject]

而不是查看这些类的文档:

[1, 2, 3, 4, 5, 6].method(:slice_after)
#=> #<Method: Array(Enumerable)#slice_after>

因此该方法在Enumerable中定义,并可供Array对象使用。