2013-10-01 27 views
0

我有这样一行:块清除地图红宝石

my_array.map do |x| 
    if x.to_i == 0 
    x.starts_with?("new") ? x[3..-1] : '' 
    else 
    Tag.find(x).name 
    end 
end 

我想打扫一下,和块移动到一个功能,我可以重复使用。

我该怎么做?我应该在函数中写一个块吗?或者一个常规功能,但是我怎样才能使用map

回答

3

“移动块”的最简单方法就是使其成为一种方法。

def foo x 
    if x.to_i == 0 
    x.starts_with?("new") ? x[3..-1] : '' 
    else 
    Tag.find(x).name 
    end 
end  


my_array.map { |x| foo(x) } 
+0

它的时候会比较好写块和屈服呢? –

+1

你错过了一个'结束'。 – toro2k

+0

@NickGinanto当你不希望重用块的任何部分。 – Max

0

拉姆达版本也是可能的,如果你喜欢的语法更好:

name_of_item = ->(item) do # use "lambda do |item|" in older versions of ruby. 
    if item.to_i == 0 
    item.starts_with?("new") ? x[3..-1] : '' 
    else 
    Tag.find(item).name 
    end 
end 

my_array.map &name_of_item 
+0

匿名函数在JavaScript中不像Ruby中那么常见。你能给出一个可能出现的实例吗? – Nikola