我有一段代码:
class Scene
def initialize(number)
@number = number
end
attr_reader :number
end
scenes = [Scene.new("one"), Scene.new("one"), Scene.new("two"), Scene.new("one")]
groups = scenes.inject({}) do |new_hash, scene|
new_hash[scene.number] = [] if new_hash[scene.number].nil?
new_hash[scene.number] << scene
end
当我启动时遇到错误:
freq.rb:11:in `[]': can't convert String into Integer (TypeError)
from freq.rb:11:in `block in <main>'
from freq.rb:10:in `each'
from freq.rb:10:in `inject'
from freq.rb:10:in `<main>'
如果我切换到另一个场景:
scenes = [Scene.new(1), Scene.new(1), Scene.new(2), Scene.new(1)]
问题消失了。
为什么在第一个案例中会收到错误消息?为什么Ruby决定将scene.number从字符串转换为整数?
关于“inject”方法还有一个额外的问题。 Ruby何时初始化“new_hash”变量,以及Ruby如何知道此变量的类型?
groups = scenes.group_by(&:number)
来实现你想要的效果,而不是使用inject。 - sepp2k