2016-06-29 4 views
-1

私がRubyでやろうとしていることは、文字列(例えば配列など)に由来する名前を持つオブジェクトを作成することです。次に、そのオブジェクトをさらにコードで使用したいと思います。Ruby:名前なしでsendによって作成されたオブジェクトにアクセスするには?

ので、例えば:

array = ["a", "b", "c"] 
array.each do |x| 
    send x + '_data' 
    x + '_data' = [] 
    x + '_data' << "foo" 
end 

以上、当然のことながら、動作しません。

私はこれに私の頭脳、文書、それにすべての朝を詰め込んだ。あなたの助けに感謝します!

アイデア?

ありがとうございます!

乾杯、 カイル

明確にするためEDIT:

[OK]を、sendの私の理解が間違っていました。

配列内の各文字列について、配列を作成したいとします。 a_datab_datac_data

はその後、私は "foo" という各配列を移入します:

は、したがって、上記のループは、3つの配列を作成します。

のでa_data[0] => "foo"

ありがとう!

ダブル編集:

ここで私がやっているのより完全な説明と私の少し変更された実際のコードです:

私はつぶやきの何千もの大きなJSONファイル(だけでなく、テキストを持っています、しかし、twitter apiからの完全なjson)。

次にトピックと関連するキーワードに基づいたハッシュの配列を持っています。 "料理"→ "器具"、 "オーブン"、 "電子レンジ"。

トピックハッシュの配列をループして、トピックキーワードのいずれかがツイートテキストの単語と一致するかどうかを確認します。

一致するものがある場合は、そのツイートを新しい配列に追加します。 y'allののヘルプみんなのため

# topics is an array of hashes. Each hash contains title and list of keywords  
    topics.each do |topic| 
    # create an array with the topic's name to store matches 
      (topic[:title] + '_tweets') = [] 
      topic[:keywords].each do |kw| 
      # loop through array of hashes (parsed json) to check for keyword matches in strings 
      tweets.each do |tweet| 
       text = tweet["text"] 
# if string contains keyword, add to the topic's array 
       if text.include? kw 
       (topic[:title] + '_tweets') << tweet 
       end 
      end 
      end 

ありがとう!

+2

「名前付きオブジェクト」とはどういう意味ですか? 'send'を使うと、オブジェクトを作成するのではなく、オブジェクトにメッセージを送ることができます。また、オブジェクトは名前を持たず、定義していない場合は 'name'という属性を持つことができます。あなたが達成しようとしていることの詳細を教えてください。 –

+2

なぜこれをやりたいですか?私があなたを正しく理解していれば、あなたは[動的にローカル変数を設定する]ことができます(http://stackoverflow.com/questions/4963678/dynamically-set-local-variables-in-ruby)が、ポストが示唆しているように、ハッシュを使用して私の実際のコードで良い – lusketeer

+0

する必要があります、私はハッシュの配列を持っています。各ハッシュには名前とキーワードのリストがあります。私は、ハッシュの配列をループし、ハッシュのキーワードをより大きなテキストの文字列にマッチさせ、それらの一致の文をハッシュの名前を持つ新しい配列に保存したいと思います。 –

答えて

0

必要なデータを保持するためにHashを作成してみませんか?

array = ["a", "b", "c"] 
data = {} 
array.each do |x| 
    key = x + '_data' 
    data[key] ||= [] 
    data[key] << "foo" 
end 

また、data[key] ||= []トリックに注意してください。それは "data[key]を調べ、それがnilならば空の配列で初期化する"という意味です。一度何かを初期化するのは慣用的なやり方です。

dataHash.new([])と宣言できます。 Hash.new([])は、指定されたキーに関連付けられた値が設定されていない場合は空の配列を返すハッシュを作成するため、data[key] ||= []はまったく必要ありません。

これは、はるかに柔軟variable variables from PHP

を使用するよりもあるしかし、あなたは本当にこのような何かが必要な場合は、次の操作を行うことができます

array = ["a", "b", "c"] 
array.each do |x| 
    instance_variable_set '@' + x + '_data', [] 
    instance_variable_get('@' + x + '_data') << "foo" 
end 

p @a_data # ["foo"] 

ここでは、現在のオブジェクトのコンテキストでインスタンス変数を作成しますインスタンス。その名前は@で始まらなければなりません。

+0

はい!ハッシュを作成し、今すぐ完全に動作します。どうもありがとう! –

関連する問題