2017-09-25 31 views
1

和方法的使用对于学习的目的,我在探索,如果我可以转换这三个方法调用:如何转换方法,过程,在Ruby中

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

你看了错误信息?错误消息告诉你它找不到的方法的名称是什么?这是什么告诉你有关'方法'期待你的论点?错误消息告诉你什么*它在哪里试图找到该方法?那告诉你“方法”是如何工作的?它在什么地方说了什么不回应'to_proc'?你为什么会用'to_proc'来得出问题的结论? –

+0

我猜''a,b,c] .each {| x | Foo :: Bar.logger.debug(x)}'会过于简单吗? ;-) – Stefan

+0

@JörgWMittag我没看过错误信息,但我不明白。我得到了将'&method'传递给接受块调用的func的想法。to_proc'方法从一个StackOverflow链接的博客:https://www.skorks.com/2013/04/ruby-ampersand-parameter-demystified/(section:The Symbol To Proc Trick)。我没有想到需要在方法的类上专门调用'method'方法。 – doremi

回答

3

您正在错误地使用method方法。从fine manual

方法(符号)→方法
中查找指定的方法如在OBJ接收机,返回一个Method对象(或提高NameError)。

你会通常说

m = some_obj.method(:some_method_name) 

,然后用m工作。他说:

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

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

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

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

如果你想在Foo::Bar.loggerdebug方法的引用,那么你会说:

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

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

[a, b, c].each(&Foo::Bar.logger.method(:debug)) 
+0

谢谢你的详细解释。 – doremi

+1

@doremi不客气,学习是我们为什么来到这里的原因,我们不是在这里吹嘘我们认为我们知道我们认为多少让其他人失望。 –