在另一个块中使用传递的块

时间:2013-03-24 10:35:00

标签: ruby select block

是否可以调用类似的内容:

def foo(param1)
   hash.select { |k,v| yield }.each do |x|
      res += do_something_with(v,param1)
   end
   res 
end
来自ERB模板的

,如:

<%= foo('A',{ v.field!='X' }) %>

在哈希上实现自定义选择?

3 个答案:

答案 0 :(得分:2)

在ruby中,如果在参数名称前面添加前导&,则可以将传递的块作为最后一个参数,例如&blockblock变量将是传递给方法的Proc

如果没有传递阻止,

block将为零。

要转发块,请调用方法并添加为最后一个参数&block

现在,让我们来处理你的问题:

在方法的最后一个参数处获取块并将其传递给select方法:

def foo(param1, &block)
   hash.select(&block).each do |x|
      res += do_something_with(v,param1)
   end
   res 
end

您也可以执行.select { |v| yield(v) }之类的操作,但这不太优雅:)

您的观点存在一个小问题,这是更正后的版本:

<%= foo('A') { |v| v.field!='X' } %>

答案 1 :(得分:1)

您可以将块作为参数加上前缀&

def foo(&param1)

然后你可以进行block_given?测试:

if block_given?
  #do something with param1

答案 2 :(得分:0)

如果您的方法foo做了一些主要与表示相关的事情,并且您需要从视图中访问它,那么拥有它的最佳位置可能是帮助程序。 Helper中声明的所有方法都可以在erb模板中使用。

您可以使用&amp; amp;将方法中的块传递给另一个方法。 synthax:

def foo(values,&action)
  #pass &action to whatever method need it.
end