如何将方法转换为 proc 以便在 Ruby 中使用 & 方法

How to convert method to proc for &method usage in Ruby

出于学习目的,我正在探索是否可以转换这三个方法调用:

Foo::Bar.logger.debug(a)
Foo::Bar.logger.debug(b)
Foo::Bar.logger.debug(c)

使用 shorthand proc &method 方法进入单行语句:

[a, b, c].each(&method(:'Foo::Bar.logger.debug'))

.debug不回复.to_proc那么自然:

NameError: undefined method `Foo::Bar.logger.debug' for class `#<Class:Foo>'

这确实有效;然而,却不像前者那样简洁:

logger = Proc.new { |x| Foo::Bar.logger.debug(x) }                                                                                                           
[a, b, c].each(&logger)

前一种方法是否可行?

您使用的 method 方法不正确。来自 fine manual:

method(sym) → method
Looks up the named method as a receiver in obj, returning a Method object (or raising NameError).

你通常会说

m = some_obj.method(:some_method_name)

然后与 m 一起工作。说:

method(:Foo::Bar.logger.debug)

应该给你一个 TypeError 因为 :Foo 是一个符号,而不是 class 或模块并且试图将 :: 应用于一个符号是没有意义的.我怀疑你实际上是在说:

method(':Foo::Bar.logger.debug')

因为这会产生您所看到的错误。假设是这种情况,那么您实际上是在尝试获取对对象 self.

中名为 ':Foo::Bar.logger.debug' 的方法的引用

如果你想引用 Foo::Bar.logger 中的 debug 方法,那么你会说:

Foo::Bar.logger.method(:debug)

结合您的 to_proc 调用(通过 &):

[a, b, c].each(&Foo::Bar.logger.method(:debug))