Ruby 通过发送方法传递要选择的块

Ruby 通过发送方法传递要选择的块,ruby,ruby-on-rails-4,Ruby,Ruby On Rails 4,给我ArgumentError:参数数目错误(0代表1..4)块和lambdas/proc不一样,不能用一个替换另一个。以下内容将引导您朝着正确的方向前进 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

给我ArgumentError:参数数目错误(0代表1..4)

块和lambdas/proc不一样,不能用一个替换另一个。以下内容将引导您朝着正确的方向前进

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

您可以通过
send
将块传递给
select

my_array.send(:select) { |element| filter_somehow(element) }
以下是一个工作示例:

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]

取决于您感兴趣的元素


PS:今天关于传球拦网也有类似的问题。我回答的第一部分是该问题答案的推导

数组上没有方法
third
,只有
First
last
,也不认为
self。First
Proc
[14]pry(main)>数组中有意义=>[1,2,3][15]撬杆(主)>array.third=>3您的错误指向哪里?好的,
third
不是核心ruby的一部分,可能是rails或其他正在添加的东西it@WandMaker是的,如果我没记错的话,活动的\u支持加起来就是
.fifth
forth\u two
。但是您可以将lambda/proc用作块。[3]pry(main)>test.send(:select,&children\u块)仍然给我一个错误ArgumentError:参数数目错误(0代表2..3)我共享了一个最小的工作代码,您可以检查一下。我不确定您正在使用的
test
是什么。对不起,魔杖。请考虑“MyNoLART”而不是测试,我是从控制台复制的。您正在显示的问题不是来自这段代码,问题在其他地方。如果您有完整的堆栈跟踪,请更新您的问题
my_array.select {|i| my_array.find {|j| j.first == i.last} }
my_array.select {|i| my_array.find {|j| i.first == j.last} }