2016-11-12 116 views
2

我試圖用map(&:gsub('-',''))刪除所有來自陣列中的字符串中的-,但我有一些困難,瞭解爲什麼它不工作:錯誤而使用array.map(:GSUB)

2.2.2 (main)> my_array = [ 'a-b-c', 'd-e-f', 'g-h-i'] 
=> [ 
    [0] "a-b-c", 
    [1] "d-e-f", 
    [2] "g-h-i" 
] 
2.2.2 (main)> my_array.map(&:gsub('-','')) 
SyntaxError: unexpected ',', expecting end-of-input 
my_array.map(&:gsub('-','')) 
         ^

但是,當我嘗試這些,他們的工作

2.2.2 (main)> my_array.map!(&:upcase) 
=> [ 
    [0] "A-B-C", 
    [1] "D-E-F", 
    [2] "G-H-I" 
] 

2.2.2 (main)> my_array.map!(&:downcase) 
=> [ 
    [0] "a-b-c", 
    [1] "d-e-f", 
    [2] "g-h-i" 
] 

2.2.2 (main)> my_array.map(&:class) 
=> [ 
    [0] String < Object, 
    [1] String < Object, 
    [2] String < Object 
] 

2.2.2 (main)> my_array.map{ | element | element.gsub("-", "") } 
=> [ 
    [0] "abc", 
    [1] "def", 
    [2] "ghi" 
] 

有誰知道爲什麼我得到這個錯誤與map(&:gsub("-", ""))

+0

因爲'('根本就不是在一個有效的字符(沒有引號)'Symbol' literal。 –

回答

3

你不能以這種方式傳遞一個方法。你應該做到以下幾點:

my_array.map{ |a| a.gsub('-','') } 

關於符號的正確使用,你可以在這裏閱讀:Ruby ampersand colon shortcut

+1

所以它不起作用,因爲從塊到方法的轉換不接受方法的參數? –

+2

是的,你不能傳遞參數 – fl00r

+1

@MattSchuchard它是從符號到proc。':gsub'是符號,所以在方法調用之後加上括號就是一個語法錯誤。 – Max

1

正如fl00r已經指出的那樣,你無法通過&:method這樣的參數傳遞給方法。然而,如果你的邏輯不是「不帶任何參數地調用這個方法」,你可以使用lambda。例如:

remove_hyphens = ->(s) { s.gsub('-', '') } 
my_array.map(&remove_hyphens) 

你可以同時使用method方法,如果是有意義的把映射邏輯在一個單獨的非字符串方法:

def remove_hyphens(s) 
    s.gsub('-', '') 
end 

my_array.map(&method(:remove_hyphens)) 

,甚至一個方法返回一個拉姆達:

def remove(char) 
    ->(s) { s.gsub(char, '') } 
end 

my_array.map(&remove('-')) 

沒有太多指向所有這些額外的機械短一次性塊,但這些都是有用的技術,如果塊更大或更復雜的,你想給它一個名稱來更好地表達你的意圖,或者如果你想在多個地方使用相同的邏輯。給予邏輯的每一個比特的名字也是有用的,如果你鏈接幾個可枚舉方法結合起來,你想使整體邏輯更易於閱讀:

my_array.select(&the_ones_i_want) 
     .map(&to_clean_values) 
     .sort_by(&standard_accounting_practices) 
     .take(11) 
     ...