传递块以通过发送方法选择

时间:2015-12-21 10:41:21

标签: ruby ruby-on-rails-4

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)

2 个答案:

答案 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今天在传递阻塞方面存在类似问题。我的答案的第一部分是推导该问题的答案