2016-06-29 9 views
-1

Was ich in Ruby versuche, ist ein Objekt mit einem Namen zu erstellen, der aus einer Zeichenfolge (z. B. in einem Array) stammt. Dann möchte ich dieses Objekt in weiterem Code verwenden.Ruby: Wie kann man auf Objekte zugreifen, die durch Senden ohne Name erstellt wurden?

So zum Beispiel:

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

Der oben, natürlich nicht funktioniert.

Ich habe mein Gehirn, die Docs, und SO den ganzen Morgen über dies. Deine Hilfe wird geschätzt!

Irgendwelche Ideen?

Danke!

Cheers, Kyle

EDIT für Klarheit:

Ok, mein Verständnis von send war falsch.

Für jede Zeichenfolge im Array möchte ich ein Array erstellen.

So über die Schleife drei Arrays erstellen würde: a_data, b_data, c_data

Dann möchte ich mit "foo" jedes Array füllen.

So a_data[0] => "foo"

Dank!

Doppel edit:

Hier ist mein leicht veränderter tatsächlicher Code mit voller Erklärung das, was ich tue:

Ich habe eine große JSON-Datei von Tausenden von Tweets (nicht nur der Text , aber die volle json von twitter api).

Ich habe dann eine Reihe von Hashes basierend auf Themen und zugehörigen Schlüsselwörtern - z.B. "Kochen" -> "Utensilien", "Backofen", "Mikrowelle".

Ich möchte das Array der Themenhashes durchlaufen und sehen, ob eines der Themen-Keywords mit Wörtern im Tweet-Text übereinstimmt.

Wenn es eine Übereinstimmung gibt, möchte ich diesen Tweet zu einem neuen Array hinzufügen.

# 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 

Danke für Ihre Hilfe Jungs!

+2

Was meinen Sie mit 'Objekt mit einem Namen'? Mit 'send' können Sie Nachrichten an Objekte senden und nicht erstellen. Außerdem haben Objekte keinen Namen und können dann ein Attribut namens name haben, wenn Sie es definieren, was Sie nicht zu tun scheinen. Bitte geben Sie weitere Einzelheiten darüber an, was Sie erreichen möchten. –

+2

warum willst du das machen? Wenn ich dich richtig verstehe, willst du in der Lage sein [dynamisch lokale Variablen zu setzen] (http://stackoverflow.com/questions/4963678/dynamically-set-local-variables-in-ruby), aber wie der Post vorgeschlagen hat, mit einem Hash sollte gut sein – lusketeer

+0

in meinem tatsächlichen Code, ich habe eine Reihe von Hashes. Jeder Hash hat einen Namen und eine Liste von Schlüsselwörtern. Ich möchte das Hash-Array durchlaufen, die Schlüsselwörter des Hashs mit Strings in einem größeren Text abgleichen und dann die Sätze dieser Übereinstimmungen in einem neuen Array mit dem Hash-Namen speichern. –

Antwort

0

Warum nicht ein Hash erstellen, um die Daten zu halten, die Sie brauchen?

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

Beachten Sie auch, data[key] ||= [] Trick. Es bedeutet "schaue in data[key]. Wenn es nil ist, initialisiere es mit leeren Array". Es ist idiomatisch, etwas einmal zu initialisieren.

Sie können data als Hash.new([]) deklarieren. Dann brauchen Sie überhaupt nicht data[key] ||= [], weil Hash.new([]) einen Hash erstellt, der ein leeres Array zurückgibt, wenn der Wert, der dem angegebenen Schlüssel zugeordnet ist, nicht festgelegt wurde.

Dieses viel flexibler ist variable variables from PHP

als die Verwendung Aber wenn man wirklich so etwas wie dieses benötigen, können Sie folgendes tun:

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

p @a_data # ["foo"] 

wir eine Instanzvariable im Kontext des aktuellen Objekts Hier erstellen Beispiel. Sein Name muss mit @ beginnen.

+0

Ja! Erstellt einen Hash und funktioniert jetzt perfekt. Danke vielmals! –

Verwandte Themen