所以我只是玩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)
为什么?我可以清楚地看到我定义了数组。我要感谢任何帮助,谢谢!
答案 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
}