Die Programmiersprache Ruby

Blog| Forum| Wiki  

Die Artikel Objekt und EIAO überschneiden sich inhaltlich. Bitte hilf mit, das zu verbessern, indem du die Artikel unter einem Namen zusammenführst.
Bitte entferne anschließend den Redundanz-Baustein.

Oft hört man ja, alles sei ein Objekt in Ruby, aber was ist denn ein Objekt eigentlich? Ein Objekt ist prinzipiell eine Instanz einer Klasse. Es kann somit Methoden ausführen und/oder Ziel von Methoden sein. Da in Ruby alles ein Objekt ist, bedeutet das zwangsläufig, dass jedes Ding in Ruby eine Instanz ist und Methoden ausführen kann - im Gegensatz zu einigen anderen Sprachen, in denen zum Beispiel String als »Primitiver Datentyp« gilt, der keinerlei Methoden ausführen kann. Ein jedes Objekt ist durch eine einmalige Identifikationsnummer, die ObjectID, gekennzeichnet:


1
2
3
4
5
6
7
8
"Stringobjekt".object_id #=> 605270898
"Stringobjekt".object_id #=> 605270918
1.object_id #=> 3
(1..10).object_id #=> 605270488
[0, 34, "ZZ"].object_id #=> 605270958
#Auch ungew��hnliche Dinge wie Klassen sind Objekte: 
Array.object_id #=> 605250958
Object.object_id #=> 605235558


Symbole sind dabei besonders; für jedes Symbol existiert in einem Programm nur eine einzige Object-ID, die sich niemals ändert.


1
2
:symbol.object_id #=> 104738
:symbol.object_id #=> 104738


Jedes Ruby-Objekt hat zudem die Möglichkeit sich eigene Methoden quasi »anzueignen«, was dazu führt, dass zwei Objekte zwar die gleiche Klasse haben, also von gleichem Typ sind, dennoch unterschiedlich sein können. Man nennt die Klasse eines Objektes, die diese »Fähigkeiten« enthält, Singletonklasse eines Objektes:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
  def hello
    puts "Hello world!"
  end
end
#Noch sind diese beiden Objekte gleich (au��er nat��rlich in ihrer Object-ID)
x = A.new
y = A.new
#Jetzt nicht mehr: 
def x.goodbye
  puts "Goodbye, world!"
end
#Um den Unterschied deutlich zu machen: 
puts x.hello #=> Hello world!
puts y.hello #=> Hello world!
puts x.goodbye #=> Goodbye, world!
puts y.goodbye #=> NoMethodError


Es gibt allerdings ein paar Objekte, die sich ein wenig anders verhalten als »normale« Objekte, die Immediate Values. Sie werden nicht direkt instanziiert und werden daher auch bei der Speicherverwaltung anders behandelt. Sie besitzen ebenfalls keine Singletonklassen.

Siehe auch