使用array.map(&:gsub)时出错

时间:2016-11-12 19:40:25

标签: ruby

我正在尝试使用-从数组中的字符串中删除所有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( "-", ""))收到此错误?

2 个答案:

答案 0 :(得分:3)

你不能以这种方式传递方法。您应该执行以下操作:

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

关于正确使用&符号,您可以在此处阅读:Ruby ampersand colon shortcut

答案 1 :(得分:1)

正如fl00r已经指出的那样,你不能通过&:method这样的方法传递参数。但是,如果您的逻辑超过“不带任何参数调用此方法”,则可以使用lambda。例如:

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

如果将映射逻辑放在单独的非String方法中是有意义的,也可以使用method方法:

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

my_array.map(&method(:remove_hyphens))

甚至是返回lambda的方法:

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)
        ...