2017-04-04 4 views
0

Ich habe ein Ruby-Projekt, wo ich programmatisch die Namen der Schlüssel in einem Hash erhalten, auf die ich zugreifen muss. Ich kann auf die Felder zugreifen muss ich auf folgende Weise:Call-Eigenschaft programmgesteuert in Ruby

current_content = entry.fields[property_name.to_sym] 

Allerdings scheint es, dass einige Inhalte nur mit einer Eigenschaft Syntax zugegriffen werden:

m.title_with_locales = {'en-US' => 'US Title', 'nl' => 'NL Title'} 

Da ich nicht weiß, „title "Wie kann ich im Voraus programmatisch anrufen? Ex:

m.${property_name}_with_locales = {'en-US' => 'US Title', 'nl' => 'NL Title'} 
+1

Beachten Sie die Verwendung von 'public_send' in der verknüpften Frage und verwenden Sie niemals' send', es sei denn, Sie wissen, warum Sie das tun. –

Antwort

4

Sie #send programmatisch verwenden können, um Eigenschaften zugreifen:

m.send("#{property_name}_with_locales") 
# => { 'en-US' => 'US Title', ... } 

Wenn Sie einen Setter zugreifen müssen und in Werte übergeben, können Sie tun:

m.send("#{property_name}_with_locales=", { 'whatever' => 'value' }) 
0

neben send wie @gwcodes geschrieben hatte, gibt es auch eval und call.

2.3.1 :010 > a 
=> [1, 2, 3] 
2.3.1 :011 > a.send("length") 
=> 3 
2.3.1 :012 > a.method("length").call 
=> 3 
2.3.1 :013 > eval "a.length" 
=> 3 

as shown on this blog postcall ist ein bisschen schneller als send.

+1

Vorsicht alte Benchmarks - ab 2008! :-) Dies gilt nicht für neuere Versionen von Ruby, und 'send' sollte eigentlich schneller sein (aber wir reden hier von winzigen Unterschieden) – gwcodes

+0

Sorry, ich habe mich nicht selbst aktualisiert -)) – marmeladze

+0

Niemals' eval "Es sei denn, Sie müssen die Konsequenzen absolut positiv nachvollziehen und verstehen (zB die Gefahr, eine Sicherheitslücke bei der Remotecodeausführung einzuführen, wenn jemand unbeabsichtigten Ruby-Code einschleusen kann). –

Verwandte Themen