Ruby 类型错误:can';t将字符串转换为整数
我有密码:Ruby 类型错误:can';t将字符串转换为整数,ruby,Ruby,我有密码: 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.numb
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
问题消失了
为什么在第一种情况下会收到错误消息?为什么Ruby决定将scene.number从字符串转换为整数
还有一个关于“注入”方法的附加问题。Ruby初始化“new\u hash”变量时,Ruby如何知道该变量的类型?尝试:
groups = scenes.inject({}) do |new_hash, scene|
new_hash[scene.number] = [] if new_hash[scene.number].nil?
new_hash[scene.number] << scene
new_hash
end
groups=scenes.injection({})do| new|u散列,scene|
新的\u散列[scene.number]=[]如果新的\u散列[scene.number].nil?
new_hash[scene.number]另外,为了解释“Ruby如何知道这个变量的类型”以及为什么它试图“将字符串转换为整数”,您可能需要修改:。Z.E.D。有关
inject
示例的详细说明,请参阅
如图所示,块返回一个数组。因此,|new|u hash,scene |
中的new|u hash
就是这个数组。当Ruby试图查找数组索引“one”时,它会抛出错误,因为“one”是字符串,而不是整数
您只需返回Z.E.D.显示的new_hash
,您将得到如下结果:
{
"two" => [
#<Scene:0x101836470 @number="two">
],
"one" => [
#<Scene:0x101836510 @number="one">,
#<Scene:0x1018364c0 @number="one">,
#<Scene:0x101836420 @number="one">
]
}
{
“两个”=>[
#
],
“一”=>[
#,
#,
#
]
}
为什么不使用可能正是您想要表达的内容
groups = scenes.group_by(&:number)
# => {"two"=>[#<Scene:0xb728ade0 @number="two">],
# "one"=>
# [#<Scene:0xb728ae30 @number="one">,
# #<Scene:0xb728ae08 @number="one">,
# #<Scene:0xb728ada4 @number="one">]}
groups=scenes.groupby(&:number)
#=>{“两个”=>[#],
#“一”=>
# [#,
# #,
# #]}
inject
是一种折叠操作,并不是您想要的。至少这样使用很麻烦<如果您想在合并或分组过程中应用某种算法,代码>合并和块可能是合适的。我知道这个问题的答案是可以接受的,但我不得不发布我的答案
groups = scenes.inject({}) { |nh, s| nh.tap {|h| (h[s.number] ||= []) << s } }
groups=scenes.injection({}{nh,s}nh.tap{h}(h[s.number]| |=[])@shingara:不,没有失败。他的代码运行时没有错误并返回预期结果。谢谢你sepp2k。我同意,“为什么它被否决了?”它运行正常,修复了代码中的错误并解释了问题。顺便说一句:通过使用groups=scenes.group\u by(&:number)
而不是inject,您可以更轻松地做您想做的事情。新的\u hash变量用injected值初始化(请记住:这是一个折叠操作,在累加器中有一个起始值)
groups = scenes.group_by(&:number)
# => {"two"=>[#<Scene:0xb728ade0 @number="two">],
# "one"=>
# [#<Scene:0xb728ae30 @number="one">,
# #<Scene:0xb728ae08 @number="one">,
# #<Scene:0xb728ada4 @number="one">]}
groups = scenes.inject({}) { |nh, s| nh.tap {|h| (h[s.number] ||= []) << s } }