[Ruby] Wie kann man ein Symbol in eine Referenz auf eine glob. Variable umwandeln?

OP #2589326
Lesenswert?

Ich habe ein Array mit Symbolen:
1
   $reset = [:$var1, :$var2]

Nun sollen die in $reset mit Symbolen benannten Variablen auf false 
gesetzt werden:
1
   $reset.each do |name|
2
      name = false
3
   end

Das funktioniert natürlich so nicht. Aber wie dann?

Wenn das Symbol ein Funktionsname ist, kann man die Funktion mit send 
aufrufen...

Hat jemand eine Idee?
Gast #2589399
Lesenswert?

Für Instance-Variablen mag ich das schon mal gelesen haben.

Aber es gibt ja neuerdings Suchmaschienen

"ruby access global variable name" liefert u.a.

http://stackoverflow.com/questions/5444198/ruby-setting-a-global-variable-by-name

Lesen werde ich das aber erst später...

Wie man vom Symbol zum String kommt sollte ja klar sein, mit .to_s und 
mit .to_sym zurück. Aber globale Variablen sollte man im Allgemeinen ja 
eher vermeiden.
Gast #2589454
Lesenswert?

Ja.mit eval geht das wohl. Das ohne eval aus
http://www.ruby-forum.com/topic/121228
kann ich so spontan nicht verstehen

stefan@AMD64X2 ~/ggg $ cat t.rb
#Ich habe ein Array mit Symbolen:

   $reset = [:$var1, :$var2]

#Nun sollen die in $reset mit Symbolen benannten Variablen auf false
#gesetzt werden:

#   $reset.each do |name|
#      name = false
#   end

$reset.each do |name|
  eval("#{name.to_s} = false")
end

puts $var1, $var2

$reset = [:var3, :var4]
$reset.each do |name|
  eval("$#{name.to_s} = false")
end

puts $var3, $var4


stefan@AMD64X2 ~/ggg $ ruby t.rb
false
false
false
false
stefan@AMD64X2 ~/ggg $
OP #2589502
Lesenswert?

Salewski, Stefan schrieb:
> Ja.mit eval geht das wohl. Das ohne eval aus
> http://www.ruby-forum.com/topic/121228
> kann ich so spontan nicht verstehen

Meinst du das hier: http://www.ruby-forum.com/topic/121228#541089 ?

Da wird wohl on the fly eine C-Funktion compiliert und in den Kernel 
eingebunden, die das macht.

> $reset = [:var3, :var4]
> $reset.each do |name|
>   eval("$#{name.to_s} = false")
> end
>
> puts $var3, $var4

Ja, eval ist für jede Sauerei gut... Danke für die Tipps.
OP #2589509
Lesenswert?

Pattex schrieb:
> Aber globale Variablen sollte man im Allgemeinen ja eher vermeiden.

Das kann man so pauschal nicht sagen.

In meinem Fall geht es um ein modular aufgebautes, kleines 
Generatorpaket, das aus html/js-Gerippen fertige html-Dateien 
produziert. Die Module stellen dem Generator über globale Variable 
Informationen zur Verfügung.

Das Ganze läuft auf rake.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren