Forum: PC Hard- und Software [Ruby] Wie kann man ein Symbol in eine Referenz auf eine glob. Variable umwandeln?


von Uhu U. (uhu)


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?

von Pattex (Gast)


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.

von Salewski, Stefan (Gast)


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 $

von Uhu U. (uhu)


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.

von Uhu U. (uhu)


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.

von Uhu U. (uhu)


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

Hier ist es beschrieben:
http://people.apache.org/~rooneg/talks/ruby-extensions/ruby-extensions.html

von Salewski, Stefan (Gast)


Lesenswert?

Danke für den Hinweis, werde ich mir irgendwann später mal ansehen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.