我试图定义一个块,我将使用它来传递多个范围的每个方法.我想创建一个lamba,并传递lambda,而不是在每个范围上重新定义块:

count = 0
procedure = lambda {|v| map[count+=1]=v}
("A".."K").each procedure
("M".."N").each procedure
("P".."Z").each procedure

但是,我得到了以下错误:

ArgumentError: wrong number of arguments(1 for 0)
    from code.rb:23:in `each'

知道这是怎么回事吗?

推荐答案

在参数上加一个符号(&),例如:

("A".."K").each &procedure

这意味着将其作为方法的特殊块参数传递.否则,它将被解释为一个正常的参数.

它还反映了您在方法本身中捕获和访问块参数的方式:

# the & here signifies that the special block parameter should be captured
# into the variable `procedure`
def some_func(foo, bar, &procedure)
  procedure.call(foo, bar)
end

some_func(2, 3) {|a, b| a * b }
=> 6

Ruby相关问答推荐

Ruby中链表大小调用的时间复杂度

如何在将拆分元素保留为空字符串的同时拆分字符串?

在 clojure 中,如何将已排序整数数组划分为连续的分区?

Ruby 3 从多个预定纤程中收集结果

仅在模块中列出方法?

Ruby - 获取正在执行的文件

Rspec:应该是(this or that)

减少哈希值

如何记录在 Ruby 程序中调用的每个方法?

Ruby on Rails:你能把 Ruby 代码放在 YAML 配置文件中吗?

有没有比 Rspec 的 `should_receive` 更少干扰的替代方法?

Ruby 输出 Unicode 字符

Ruby 'require' 语句是在类定义的内部还是外部?

Ruby Koan 151 引发异常

在 Ruby 中,有没有办法使用 hash.each_with_index do |[k,v], i| 之类的东西?

在 Rails 中,如何向 String 类添加新方法?

如何在 RSpec 2 中自动加载 spec_helper.rb

如何在 Ruby 中找到除法的余数?

Ruby NOT Rails 中有复数函数吗?

在 Ruby 中解析制表符分隔文件的最佳方法是什么?