出于学习目的,我正在研究是否可以转换以下三个方法调用:
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)
前一种方法可行吗?
您使用的method方法不正确。从精美的手册中:
方法(符号)?method
在obj中将指定的方法查找为接收方,返回一个Method对象(或raisingNameError)。
你通常会说
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)
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |