出于学习目的,我正在探索是否可以转换这三种方法调用:
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)
前一种方法是否可行?
答案 0 :(得分: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))