3 Stimmen

Ruby Instanzreferenz in Klassenmethode?

Ich versuche, Klassenvariablen für eine Klasseninstanz aus einer Datei zu füllen, und der einzige Weg, den ich herausgefunden habe, um das zu tun, ist so etwas wie

a=Thing.new
File.read("filename.ext").each_line do |arguments| #this will => things like @variable=str\n
eval( "a.instance_eval {" + arguments.chop + "}")   #daher das umständliche eval eval chop
end

Das einzige Problem, das ich festgestellt habe, ist, dass ich beim Versuch, dies in einer Klassenmethode zu implementieren (um dies für mehrere Instanzen auf einmal zu tun), nicht weiß, wie ich das erreichen kann:

class Thing
attr_accessor :variable

 def self.method
  File.read("filename.ext").each_line do |arguments|
   eval("instance.instance_eval{" + arguments.chop + "}")   #diese Zeile
  end
 end
end

nämlich die Referenz auf die Instanz, die die Methode aufruft. self wird in diesem Fall nur Thing sein, also gibt es einen Weg, das zu tun? Viel wichtiger ist vielleicht ein besseres Gesamtkonzept. Ich habe Ruby erst gestern gelernt, also hatte ich noch keine Gelegenheit, einige der raffinierteren Tricks zu sehen, die es gibt, und meine Sprachreife ist noch ein wenig frisch.

Zum Kontext: Thing ist ein Charakter in einem Spiel, der seine Grundwerte aus einer Speicherdatei lädt.

1voto

Chris Heald Punkte 59198

Nun, zunächst einmal schau dir Marshal an. Es wird speziell zum Dumpen von Datenstrukturen in serialisierte Formate und zum Laden derselben verwendet.

Abgesehen davon, wenn du in deiner Richtung bleiben möchtest, versuche etwas Ähnliches wie dies:

class Thing
  attr_accessor :variable

  def self.method
    File.read("filename.ext").each_line do |arguments|
      ivar, val = arguments.strip.split("=", 2)
      instance.instance_variable_set(ivar, val)
    end
  end
end

#instance_variable_set ermöglicht es dir... na ja, Instanzvariablen an einem Objekt nach Namen zu setzen. Kein hässliches eval erforderlich!

Zur Veranschaulichung:

class Foo
  attr_accessor :bar
end

foo = Foo.new
foo.instance_variable_set("@bar", "whatzits")
puts foo.bar # => whatzits

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X