【问题标题】:How to convert method to proc for &method usage in Ruby如何将方法转换为 proc 以在 Ruby 中使用 &method
【发布时间】:2017-09-25 01:31:55
【问题描述】:

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

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)

前一种方法可行吗?

【问题讨论】:

  • 您是否阅读了错误信息?错误消息告诉您找不到的方法的名称是什么?关于method 期望你提出的论点,这告诉了你什么?错误消息告诉您它试图找到该方法的哪里?这告诉您method 的工作原理是什么?它在哪里说不回复to_proc?为什么你会得出问题出在to_proc 的结论?
  • 我猜[a, b, c].each { |x| Foo::Bar.logger.debug(x) } 会不会太简单了? ;-)
  • @JörgWMittag 我确实阅读了错误消息,但我不明白。我的想法是将&amp;method 传递给一个函数,该函数接受一个块调用.to_proc 来自StackOverflow 链接博客的方法:skorks.com/2013/04/ruby-ampersand-parameter-demystified(部分:Proc 技巧的符号)。我没有想到需要专门在方法的类上调用 method 方法。
  • @Stefan 绝对简单,但如上所述,这是一个学习更多关于 procs 和 &amp;method 方法的练习。

标签: ruby proc


【解决方案1】:

您错误地使用了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.logger 中的debug 方法,那么你会说:

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

结合您的to_proc 呼叫(通过&amp;):

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

【讨论】:

  • 感谢您的详尽解释。
  • @doremi 不客气,学习是我们来这里的原因,我们不是来吹嘘我们认为自己知道多少而贬低别人。
猜你喜欢
  • 2011-02-26
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2013-04-18
  • 2013-06-17
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多