我需要一个块数组,每个块都可以带一个参数:
array = [
block do |x| puts x end,
block do |x| puts x.to_s+" - " end
]
以下列形式提出请求:
array[0] << 34
我有想法将大数字转换成单词。我想知道块的限制。可能有另一种方法,但我很好奇是否可能。
答案 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) }