2

是否可以这样称呼:

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' }) %>

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

4

3 回答 3

2

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

block如果没有通过任何块,则为 nil。

要转发块,请调用方法并添加为最后一个参数&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' } %>
于 2013-03-24T10:44:35.320 回答
1

您可以通过在块前面加上 and 来将块作为参数&

def foo(&param1)

然后你可以block_given?测试:

if block_given?
  #do something with param1
于 2013-03-24T10:39:12.027 回答
0

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

您可以使用 & 合成器将块从一个方法传递到另一个方法:

def foo(values,&action)
  #pass &action to whatever method need it.
end
于 2013-03-24T10:42:43.993 回答