数组中的Ruby块

时间:2014-03-07 18:27:49

标签: ruby arrays block

我需要一个块数组,每个块都可以带一个参数:

array = [
  block do |x| puts x end,
  block do |x| puts x.to_s+" - " end
]

以下列形式提出请求:

array[0] << 34

我有想法将大数字转换成单词。我想知道块的限制。可能有另一种方法,但我很好奇是否可能。

3 个答案:

答案 0 :(得分:7)

虽然你得到的答案告诉你Ruby procs和lambdas有什么可能,但我认为重要的是要理解Ruby中的块不是对象并且不能包含在数组中或以其他方式操作作为Ruby对象。它们只与方法调用一起出现。

我希望能够为您指出一些关于块,触发器和lambdas主题的官方/完整文档,但是虽然有很多东西,但大多数都有一些微妙但重要的缺陷。但是,如果你谷歌的Ruby块,procs和lambdas,你会得到至少90%准确的东西。

答案 1 :(得分:5)

你可以使用lambdas:

array = [ lambda { |x| puts x }, lambda { |x| puts "#{x} - " } ]

array[0].call(34) # prints 34

如果您需要使用<<运算符来调用Proc,那么您可以创建一个类并重载它:

class Foo
    def initialize( &proc )
        @proc = proc
    end
    def <<( input )
        @proc.call( input )
    end
end

array = [
    Foo.new { |x| puts x },
    Foo.new { |x| puts "#{x} - " } ]

array[0] << 34 # prints 34

答案 2 :(得分:3)

通过特定的lambda运行它:

a = [
  ->(x) { puts x },
  ->(x) { puts "#{x} - " }
]

a[0].(34) # => prints 34

要在每个区块中运行它:

a.map { |b| b.(3) }