3 Stimmen

Ruby-Instanzvariable auf Klassenebene

Ich habe gerade meine Kenntnisse über Ruby aufgefrischt und bin auf den Blog dieses Typen gestoßen, in dem es um die Erstellung von Instanzvariablen auf Klassenebene in Ruby geht. Ich versuche immer noch zu verstehen, was der Code hier eigentlich macht. Sein Blog kann hier gefunden werden

http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

und ich habe einen einfachen Code auf der Grundlage seines Beispiels erstellt, um zu zeigen, was ich zu verstehen versuche

class Polygon
  class << self; attr_accessor :sides end
  @sides = 10
  def initialize
  end
end

class Triangle < Polygon
  @sides = 3
  class << self; attr_accessor :sides end
  def initialize
  end
end

puts Triangle.sides #3
puts Polygon.sides #10

Die Zeile, die ich wirklich verstehen möchte, lautet also (ihr habt es wahrscheinlich schon erraten),

class << self; attr_accessor :sides end

Was tut dies wirklich tun? was ist er anhängen selbst zu Klasse? ist Klasse ein Array dann? Bitte erläutern Sie dies so genau wie möglich. Vielen Dank!

6voto

Chubas Punkte 17414

Le site << ist keine Methode (das gilt übrigens nicht nur für Array), sondern ist die Syntax für die Definition einer Metaklasse

Grundsätzlich ist eine Metaklasse DIE Klasse eines einzelnen Objekts (manche Leute nennen sie Singleton-Klassen). Wenn Sie zum Beispiel definieren

x = Foo.new
y = Foo.new
class << x
  def quack
    "Quack!"
  end
end

und ruft dann x.quack wird "Quack" zurückgeben, aber y.quack wirft eine NoMethodError . Der Code wird also nur für die Metaklasse von x ausgewertet.

Aber... Klassen sind doch auch Objekte, oder? Wenn Sie also diese Zeile auswerten, ist das gleichbedeutend mit

class << Triangle
  attr_accessor :sites
end

die lediglich eine Instanzvariable definieren wird in der Metaklasse des Dreiecks . Das heißt, die Triange Klasse, die ebenfalls ein Objekt ist, hat eine Instanzvariable namens sides

Mehr Infos unter este y este Links. Sobald Sie die Idee haben, gehen Sie zur nächsten irb-Konsole und experimentieren Sie damit.

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