Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 类型错误:can';t将字符串转换为整数_Ruby - Fatal编程技术网

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 } }