1

ハッシュのネストされた配列を作成したいと思います。branch私は次のような配列を持っています:

branch = ["handbags", "womens-shoes", "womens-beauty", "womens-clothes"]

次に、次のものを含む別の配列がありますhandbags

handbags = ["wallets", "backpacks", "clutches", "evening-handbags", "hobo-bags", "satchels", "shoulder-bags", "tote-bags"]

handbags配列をループに挿入して、次のbranchようにします。

branch = {"handbags" => ["wallets", "backpacks", "clutches", "evening-handbags", "hobo-bags", "satchels", "shoulder-bags", "tote-bags"], "womens-shoes"],...}

私はこれを次のように試みます:

def insert_branch(branch, branch_index, candidate, candidate_index)
    branch[[branch_index], branch[branch_index]] ||= {}
    branch[[branch_index], branch[branch_index]] = candidate[candidate_index]  
end

どこ

candidate[candidate_index] = ["wallets", "backpacks", "clutches", "evening-handbags", "hobo-bags", "satchels", "shoulder-bags", "tote-bags"]

私にくれます

配列を整数に変換できません

どうすればこれを達成できますか?

4

6 に答える 6

4

整数とは異なるオブジェクトで配列にインデックスを付けることはできません。ハッシュを使用する必要があります。ブランチは配列であるため、Rubyは整数が各要素にインデックスを付けることを期待し、別の配列を指定すると、それを整数に変換しようとするため、エラーが発生します。これを試して:

branch = Hash.new #unnecessary, but makes the class explicit
handbags = ["wallets", "backpacks", "clutches", "evening-handbags", "hobo-bags", "satchels", "shoulder-bags", "tote-bags"]
branch["handbags"] = handbags

branch.inspectは以下を生成します:

"{\"handbags\"=>[\"wallets\", \"backpacks\", \"clutches\", \"evening-handbags\", \"hobo-bags\", \"satchels\", \"shoulder-bags\", \"tote-bags\"]}"
于 2012-05-03T16:39:42.863 に答える
1

あなたが本当に持っているなら:

array = ["foo", "bar"]
foo   = ...
bar   = ...

その場合、運が悪くなります。名前に基づいてローカル変数によって参照されるオブジェクトを(良い方法で)取得することはできません。名前で値を検索したい場合は、ハッシュを使用して値を格納し、後で取得する必要があります。つまり、データ構造を次のように変更する必要があります。

array  = ["foo","bar"]
things = {
  "foo" => ...,
  "bar" => ...
}

...しかしもちろん、それ以上の作業をする必要なしにあなたはあなたの答えを持っています。

何らかの理由で単一のハッシュリテラルを使用するようにコードを変更できないが、ローカル変数の代わりにインスタンス変数を使用するようにコードを変更できる場合は、次のようにすることができます。

array  = ["foo", "bar"]
@foo   = ...
@bar   = ...
branch = Hash[ array.map{ |name| [name,instance_variable_get("@#{name}")] } ]

上記のコードにはRuby1.9が必要です。代わりに古い1.8を使用している場合は、そう言ってください。

実際に見られる:

irb(main):001:0> a = %w[foo bar jim]
#=> ["foo", "bar", "jim"]

irb(main):002:0> @foo = %w[ 1 2 3 ]
#=> ["1", "2", "3"]
irb(main):003:0> @bar = %w[ 4 5 6 ]
#=> ["4", "5", "6"]
irb(main):004:0> @jim = %w[ 7 8 9 ]
#=> ["7", "8", "9"]

irb(main):006:0> Hash[ a.map{ |name| [name,instance_variable_get("@#{name}")] } ]
#=> {"foo"=>["1", "2", "3"], "bar"=>["4", "5", "6"], "jim"=>["7", "8", "9"]}
于 2012-05-03T17:11:26.667 に答える
0

Ruby配列クラスは次のように述べています。

配列は、任意のオブジェクトの順序付けられた整数インデックス付きのコレクションです。

したがって、問題は、インデックスが整数でなければならないということですが、文字列インデックスを使用して配列に割り当てようとしています。(文字列をキーとして使用できるように)全体をハッシュに変換することを検討するか、次のようにハッシュまたはサブ配列を適切なインデックスの配列に配置することができます。

idx = branch.index "handbags"
branch[idx] = { "handbags" => handbags }

また、Array#zipを調べて、必要な機能が提供されるかどうかを確認する必要があります。

于 2012-05-03T16:45:51.307 に答える
0

コードでインデックス作成の問題が発生しています。ステートメント:

branch[[branch_index], branch[branch_index]]

Rubyはbranch、インデックス[branch_index](有効なインデックスではありません...配列です)にアクセスし、branch[branch_index]多くの要素(これも有効な要素数ではありません...文字列です)にアクセスしようとしていると理解しています。

ここで実際に必要なのは次のとおりです。

def insert_branch(branch, branch_index, candidate, candidate_index)
    branch[branch_index] = {branch[branch_index] => candidate[candidate_index]}
end
于 2012-05-03T16:41:37.310 に答える
0

あなたが持っているものは少しずれています。多分これはあなたにいくつかのガイダンスを与えるでしょう。

branch = ["handbags", "womens-shoes", "womens-beauty", "womens-clothes"]

handbags = ["wallets", "backpacks", "clutches", "evening-handbags", "hobo-bags", "satchels", "shoulder-bags", "tote-bags"]

def insert_branch(catagories,catagories_index,branch)
  catagories[catagories_index] = Hash[catagories[catagories_index],branch] 
end

insert_branch(branch,0,handbags)


>> p branch  # OUTPUT IS
>> [{"handbags"=>["wallets", "backpacks", "clutches", "evening-handbags", "hobo-bags", "satchels", "shoulder-bags", "tote-bags"]}, "womens-shoes", "womens-beauty", "womens-clothes"]
于 2012-05-03T16:48:20.743 に答える
0

あなたがやろうとしていることは、次のことだけで行うことができます。

a = %w|Things Animals Cities|
things = %w|Desk Table Lamp|

a[0] = {a[0] => things}

a
=> [{"Things"=>["Desk", "Table", "Lamp"]}, "Animals", "Cities"]

あなたの場合、それは

branch[0] = {branch[0] => handbags}

編集:メタプログラミングを使用して、名前に基づいて配列を検索できます。

categories = %w|Things Animals Cities|
things = %w|Desk Table Lamp|
animals = %w|Dog Cat Turtle|
cities = %w|London Rome Madrid|

result = categories.map do |category| 
  { category => eval(category.downcase) }
end

result
=> [{"Things"=>["Desk", "Table", "Lamp"]},
    {"Animals"=>["Dog", "Cat", "Turtle"]},
    {"Cities"=>["London", "Rome", "Madrid"]}]

を使用して、カテゴリによって名前を値としてeval取得することに注意してください。Array

于 2012-05-03T16:55:22.487 に答える