如何在Ruby中将方法转换为proc以用于&method

dor*_*emi 1 ruby proc

出于学习目的,我正在研究是否可以转换以下三个方法调用:

Foo::Bar.logger.debug(a)
Foo::Bar.logger.debug(b)
Foo::Bar.logger.debug(c)
Run Code Online (Sandbox Code Playgroud)

使用速记proc &method方法转换为单行语句:

[a, b, c].each(&method(:'Foo::Bar.logger.debug'))
Run Code Online (Sandbox Code Playgroud)

.debug.to_proc自然地回应:

NameError: undefined method `Foo::Bar.logger.debug' for class `#<Class:Foo>'
Run Code Online (Sandbox Code Playgroud)

这确实有效;但是,它不像前者那么简洁:

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

前一种方法可行吗?

mu *_*ort 5

您使用的method方法不正确。从精美的手册中

方法(符号)?method
obj中将指定的方法查找为接收方,返回一个Method对象(或raising NameError)。

你通常会说

m = some_obj.method(:some_method_name)
Run Code Online (Sandbox Code Playgroud)

然后使用m。说:

method(:Foo::Bar.logger.debug)
Run Code Online (Sandbox Code Playgroud)

应该给您一个TypeError因为:Foo是符号而不是类或模块的信息,而尝试将其应用于::符号没有任何意义。我怀疑您实际上是在说:

method(':Foo::Bar.logger.debug')
Run Code Online (Sandbox Code Playgroud)

因为那样会产生您所看到的错误。假设是这种情况,那么您实际上是在尝试获取':Foo::Bar.logger.debug'对object中命名的方法的引用self

如果要引用中的debug方法,Foo::Bar.logger则可以说:

Foo::Bar.logger.method(:debug)
Run Code Online (Sandbox Code Playgroud)

结合您的to_proc通话(通过&):

[a, b, c].each(&Foo::Bar.logger.method(:debug))
Run Code Online (Sandbox Code Playgroud)

  • @doremi 不客气,学习是我们在这里的原因,我们来这里不是为了通过贬低别人来吹嘘我们认为自己知道多少。 (2认同)