如何将方法转换为 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))
出于学习目的,我正在探索是否可以转换这三个方法调用:
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 aMethod
object (or raisingNameError
).
你通常会说
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))