my_array = [[1, 'foo_parent', nil], [2,'bar_is_son_of_foo', 1], [3, 'zok_is_son_of_bar', 2]]
def children_block
Proc.new do |c|
if c.is_a? Array
c[2] == self[0]
end
end
end
my_array.send(:select) &children_block
给我ArgumentError:错误的参数数量(0表示1..4)
答案 0 :(得分:0)
块和lambdas / procs不一样,你不能只用另一个替换。以下内容应指导您正确的方向
my_array.send(:select) { |element| filter_somehow(element) }
答案 1 :(得分:0)
你可以这样做,通过select
将一个块传递给send
。
my_array.send(:select, &children_block)
以下是一份工作样本:
my_array = [[1, 'foo_parent', nil], [2,'bar_is_son_of_foo', 1], [3, 'zok_is_son_of_bar', 2]]
def children_block
Proc.new do |c|
p c
end
end
p my_array.send(:select, &children_block)
#=> [1, "foo_parent", nil]
[2, "bar_is_son_of_foo", 1]
[3, "zok_is_son_of_bar", 2]
您尝试解决的问题也可以使用以下方法解决:
my_array.select {|i| my_array.find {|j| j.first == i.last} }
或
my_array.select {|i| my_array.find {|j| i.first == j.last} }
取决于您感兴趣的元素。
PS:There was another question今天在传递阻塞方面存在类似问题。我的答案的第一部分是推导该问题的答案