main:Object的未定义方法'array'

时间:2014-03-12 00:58:02

标签: ruby arrays undefined

所以我只是玩ruby中的块,我写了这段代码:

#!/usr/bin/env ruby

def my_map ary
    a = ary.clone
    if block_given?
        while element = a.shift
            yield element
        end
    else
        ary
    end
end

array = [1, 2, 3, 4, 5]

my_map array { |e|
    puts e * 2
}

p array

但它一直给我这个错误:

./tests.rb:16:in `<main>': undefined method `array' for main:Object (NoMethodError)

为什么?我可以清楚地看到我定义了数组。我要感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

Ruby解释器解析:

my_map array { |e|
    puts e * 2
}

为:

my_map(array ( { |e| puts e * 2 } ) ) 

解释了为什么它认为数组应该是一种方法,以避免这种变化:

my_map array { |e|
    puts e * 2
}

为:

my_map(array) { |e|
    puts e * 2
}

或:

my_map array do |e|
    puts e * 2
end

花括号用于单行块,对于多行块应该避免

答案 1 :(得分:0)

传递参数和多行块时,必须将参数放在大括号

之间
my_map(array) { |e|
  puts e * 2
}

或使用do end block

my_map array do |e|
  puts e * 2
end

无论如何,这个单行块看起来是这种情况的最佳方法:

my_map(array) { |e| puts e * 2 }

答案 2 :(得分:0)

这应该有效:

my_map(array) { |e|
    puts e * 2
}