ruby - 在Ruby中,如何编写一个可以与& :symbol?一起使用的简单方法

标签 ruby proc

这个 article触及问题,但没有给出解决方案。

当我想编写一个方法并可选地传递一个可以为 null 或 ???? (proc, lambda方法block、???)。让我们暂时称它为 block 因为 block 有效。 block 采用一个必需的参数。该方法及其调用的示例如下:

#!/usr/bin/env ruby

def foo(&proc)
  puts "before"
  if proc
    yield "passed to proc"
  end
  puts "after"
end

def add_message(s)
  puts "from add_message #{s}"
end

foo { |s| add_message(s) }
foo

输出是:

before
from add_message passed to proc
after
before
after

太好了。但是,我想做的是能够像这样调用 foo:foo(&:add_message)。但我不能。更改上面的第 15 行我得到:

before
./temp.rb:11:in `add_message': wrong number of arguments (given 0, expected 1) (ArgumentError)
    from ./temp.rb:6:in `foo'
    from ./temp.rb:15:in `<main>'

而且,正如上面的文章所提到的,arity 现在是 -2。那么,如何编写像 add_message 这样可以与 &:add_message 一起使用的简单方法。或者!!!就像 99.99% 的情况一样,请让我在正确的轨道上执行此操作。

最佳答案

问题是 Symbol#to_proc 没有创建正确调用 add_message 方法的proc。

# `yield` will pass its arguments to proc
>> :add_message.to_proc.call('passed to proc')
# => ArgumentError

这会调用 'passed to proc'.add_message,因为我们的方法是在 Object 中定义的,它在 String 上调用时会起作用,但是缺少必需的参数。

解决方案是制作一个可以接受与 add_message 方法相同的参数的 proc,并将它们传递给该方法。我们可以使用 Object#method 返回 Method 对象,该对象实现了自己的 to_proc 并具有与方法相同的数量。

>> method(:add_message).to_proc.arity
=> 1

>> method(:add_message).to_proc.call('passed to proc')
from add_message passed to proc
>> foo(&method(:add_message))
before
from add_message passed to proc
after

关于ruby - 在Ruby中,如何编写一个可以与& :symbol?一起使用的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72072306/

相关文章:

c - 如何计算旧内核上的自愿上下文切换

c - 通过 shell (cat) 或通过程序 (fread) 读取 proc 文件的区别

oracle - 保留时间值的动态 PL/SQL 日期参数

ruby - 如果它是私有(private)方法,我该如何记录 URL 编码?

ruby-on-rails - Rails 2.3.9 缺少 POST 负载

ruby - 是否有一些工具或模式可以在 emacs 中重构 ruby​​ 代码?

c - 过程 : Regarding proc Executable size difference

Ruby 模板模块

html - application.scss 没有风格化输入,textarea,select

sql - 在c中生成动态sql