如何在Ruby中将方法转换为proc和方法用法

问题描述 投票:1回答:1

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

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

使用速记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)

前一种方法是否可行?

ruby proc
1个回答
5
投票

你错误地使用了method方法。来自fine manual

方法(sym)→方法 在obj中查找命名方法作为接收器,返回Method对象(或者提升NameError)。

你经常说

m = some_obj.method(:some_method_name)

然后与m合作。他说:

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

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

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

因为这会产生你所看到的错误。假设情况就是这样,那么你实际上是想在对象':Foo::Bar.logger.debug'中获得对名为self的方法的引用。

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

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

结合你的to_proc电话(通过&):

[a, b, c].each(&Foo::Bar.logger.method(:debug))
© www.soinside.com 2019 - 2024. All rights reserved.