我有一个方法需要一个代码块.

def opportunity
  @opportunities += 1
  if yield
    @performances +=1
  end
end

我这样称呼它:

opportunity { @some_array.empty? }

但我如何传递多个代码块,以便可以使用yield两次,比如:

def opportunity
  if yield_1
    @opportunities += 1
  end
  if yield_2
    @performances +=1
  end
end

以及:

opportunity {@some_other_array.empty?} { @some_array.empty? }

我知道这个例子可以在没有yield 的情况下完成,但它只是为了说明.

推荐答案

就其本身而言,您不能传递多个块,但可以传递多个过程或lambda:

使用1.9语法:

opportunity ->{ @some_array.empty? }, ->{ @some_other_array.empty? }

在方法本身:

def opportunity(lambda1, lambda2)
  if lambda1.()
    @opportunities += 1
  end
  if lambda2.()
    @performances += 1
  end
end

Ruby相关问答推荐

如何使用另一个Ruby 中的Ruby 中的区域设置?

Ruby 中的 Float#floor 和 Float#to_i 有什么区别?

BasicObject 的 singleton_class 的超类如何以及为什么是 Ruby 中的 Class 类?

Ruby - 将两个哈希与一些相似的键合并

使用 Drive API 创建空文件

Ruby 中的 Monad 类似功能

需要Ruby

有没有办法通过哈希初始化对象?

Ruby:如何判断字符是大写还是小写

判断字符串是否包含Ruby数组中的任何子字符串

Puppet/Facter无法检索事实 fqdn:如何修复或规避?

为什么整数除法在许多脚本语言中舍入?

Ruby 和您必须使用 OpenSSL 支持重新编译 Ruby 或更改 Gemfile 中的源代码

如何在没有 Rails 的情况下使用 RSpec?

项目目录的相对路径

找不到Bundle 命令 mac

如何传递函数而不是块

Ruby中的字符串和符号有什么区别?

在 Ruby 中创建二维数组和访问子数组

如何判断一个类是否已定义?