Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Dateilokale Variablen
BeitragVerfasst: 15 Aug 2011, 07:52 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
…wollte ich einfach zum Spaß mal in Ruby probieren. Gemeint ist ein Speicher, der für jede Code-Datei einen eigenen Namensraum bietet, dafür aber über Klassen- und Methodengrenzen hinweg seine Werte behält.

So soll es funktionieren: Zur Demonstration braucht man mehrere Dateien. "here" ist die Zugriffs-Methode auf die dateilokalen Variablen.# one.rb
def set_a
here.a = 'one'
end

p here.a
set_a
p here.adef set_a
here.a = 'two'
end

p here.a
set_a
p here.aZwei Dateien mit beinahe demselben Inhalt. here.a wird ausgegeben, in einer Method gesetzt und nochmal ausgegeben.

Aufgerufen werden beide aus einer dritten Datei, die auch die Implementation von "here" läd:# test.rb
require 'here'

require 'one'
require 'two'

p here.a
Ausgabe:# aus one.rb
nil
"one"

# aus two.rb
nil
"two"

# aus test.rb
nil
In one.rb hat here.a also einen anderen Wert als in two.rb.

Fehlt nur noch die Implementation, die aber dank caller sehr einfach wird:require 'ostruct'

module Kernel
def here
($HERE ||= Hash.new do |hash, key|
hash[key] = OpenStruct.new
end)[caller[0][/(.*?):\d/, 1]]
end
endEinfach den Namen der aufrufenden Datei als Key für einen globalen Hash benutzen und ein OpenStruct zurückgeben. (So könnte man sogar Variablen machen, die in allen Zeilen mit derselben Zeilennummer denselben Wert haben. Bug Ahoi! :P)

Das Ganze ist eigentlich mehr Spielerei, aber vielleicht findet es ja jemand nützlich.

Spontan fallen mir Dateien unter lib/tasks/ ein, bei denen ich ständig das Problem habe, dass ich Variablen zwischen den Tasks teilen möchte (und als Lösung immer nur globale Konstanten oder $-Variablen finde).

Referenzen: In Lua kann man "file-local variables" definieren, indem man sie mit "local" außerhalb eines Blocks markiert.

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: