2

タイトル通りにしようと思います。これが私のコードです:

school.each { |x| school[:students][x].merge!(semester:"Summer") }

上記の「[x]」に問題を特定したと思います。「[2]」などの配列位置を代入すると、正常に機能します。反復をどのように機能させることができますか?

上記の情報では不十分な場合、またはより良い解決策を提供したい場合は、以下の詳細を参照してください。ありがとう!


私が得るエラーメッセージ:

file.rb:31:in []': no implicit conversion of Array into Integer (TypeError) from file.rb:31:inblock in ' from file.rb:31:in each' from file.rb:31:in'

以下の変更前のネストされたハッシュ:

school = { 
  :name => "Happy Funtime School",
  :location => "NYC",
  :instructors => [ 
    {:name=>"Blake", :subject=>"being awesome" },
    {:name=>"Ashley", :subject=>"being better than blake"},
    {:name=>"Jeff", :subject=>"karaoke"}
  ],
  :students => [ 
    {:name => "Marissa", :grade => "B"},
    {:name=>"Billy", :grade => "F"},
    {:name => "Frank", :grade => "A"},
    {:name => "Sophie", :grade => "C"}
  ]
}

最後の 4 つのハッシュのそれぞれに :semester=>"Summer" を追加しようとしています。これが私が行こうとしているものです:

# ...preceding code is the same. Changed code below...
  :students => [ 
    {:name => "Marissa", :grade => "B", :semester => "Summer"},
    {:name=>"Billy", :grade => "F", :semester => "Summer"},
    {:name => "Frank", :grade => "A", :semester => "Summer"},
    {:name => "Sophie", :grade => "C", :semester => "Summer"}
  ]
}
4

3 に答える 3

1

学生を反復するだけです:

school[:students].each { |student| student[:semester] = "Summer" }

または、マージを使用して:

school[:students].each { |student| student.merge!(semester: "Summer") }
于 2013-09-19T20:21:42.833 に答える
0

を使用して以下のようにしますHash#store

require 'awesome_print'

school = {
                 :name => "Happy Funtime School",
             :location => "NYC",
          :instructors => [
                    {
                                 :name => "Blake",
                              :subject => "being awesome"
                    },
                    {
                                 :name => "Ashley",
                              :subject => "being better than blake"
                    },
                    {
                                 :name => "Jeff",
                              :subject => "karaoke"
                    }
          ],
             :students => [
                    {
                               :name => "Marissa",
                              :grade => "B"
                    },
                    {
                               :name => "Billy",
                              :grade => "F"
                    },
                    {
                               :name => "Frank",
                              :grade => "A"
                    },
                    {
                               :name => "Sophie",
                              :grade => "C"
                    }
          ]
}

school[:students].each{|h| h.store(:semester ,"Summer")}
ap school,:index => false,:indent => 10

出力

{
                 :name => "Happy Funtime School",
             :location => "NYC",
          :instructors => [
                    {
                                 :name => "Blake",
                              :subject => "being awesome"
                    },
                    {
                                 :name => "Ashley",
                              :subject => "being better than blake"
                    },
                    {
                                 :name => "Jeff",
                              :subject => "karaoke"
                    }
          ],
             :students => [
                    {
                                  :name => "Marissa",
                                 :grade => "B",
                              :semester => "Summer"
                    },
                    {
                                  :name => "Billy",
                                 :grade => "F",
                              :semester => "Summer"
                    },
                    {
                                  :name => "Frank",
                                 :grade => "A",
                              :semester => "Summer"
                    },
                    {
                                  :name => "Sophie",
                                 :grade => "C",
                              :semester => "Summer"
                    }
          ]
}
于 2013-09-19T20:34:46.320 に答える
0

問題は、array.each {|x| を実行するときです。何かを行う}、x は実際には配列内の各要素を参照します。

たとえば、ループの最初の反復では、

x = {:name => "Marissa", :grade => "B"}

したがって、あなたが実際に行っているのは、参照しようとしていることです:

school[:student][{:name => "Marissa", :grade => "B"}]

どちらがうまくいかない

代わりにできることは、インデックスを追跡するための for ループを作成することです。

for i in 0 ... school[:student].count
    school[:students][i].merge!(semester:"Summer")
end

編集:ステファンの解決策は私のものよりもはるかに優れていますが、どこが間違っているかを示すためにこれを残します.

于 2013-09-19T20:23:37.897 に答える