是否可以调用类似的内容:
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' }) %>
在哈希上实现自定义选择?
答案 0 :(得分:2)
在ruby中,如果在参数名称前面添加前导&
,则可以将传递的块作为最后一个参数,例如&block
,block
变量将是传递给方法的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(¶m1)
然后你可以进行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