2016-04-29 5 views
0

Dies ist mein erster Beitrag und ich bin ziemlich neu in der Programmierung/dieser Seite, also entschuldige ich mich im Voraus, wenn ich etwas falsch mache/nervt.Sind diese Objekte? Warum sehen sie so aus, wenn ich sie drucke?

Ich wollte einen Weg finden, um Objekte zu definieren, ohne dies für jedes Objekt zu tun. Ich kam mit dieser

class Number 
    def initialize(name) 
    @name = name 
    end 

    def description 
    puts "I'm #{@name} " 
    end 
end 

a = ["zero", "one","two", "three", "four"] 

for i in (0..5) do 
    a[i] = Number.new(a[i]) 
end 

a[3].description 

Ich hoffe, jemand kann mir sagen, welche Art von Frankensteins Monster ich erstellt habe?

Es scheint zu funktionieren, eine [3] .Description gibt "Ich bin drei" zurück, aber bedeutet das, dass drei/a [3] als eigenes Objekt und nicht als Element eines Arrays existiert?

Außerdem, wenn ich versuche zu tun:

puts a[3] 

ich:

<Context::Number:0x000000009b7fd0 @name="three">, # 

Um zu klären, ich möchte nur wissen, ob ich tatsächlich Objekte verwaltet hier zu schaffen, und warum auf der Erde, wenn Ich versuche, auf Elemente meines Arrays zuzugreifen Ich bekomme dieses seltsame Feedback (irgendwie scheint es Zugriff auf Speicher oder etwas, aber das ist ein wenig jenseits von mir)

Mein Dank im Voraus für alle wh o Antworten darauf.

Antwort

1

Alle Objekte stehen für sich selbst, und zwar unabhängig davon, ob sie von/in andere Objekte wie Array-Instanzen enthalten sind.

In Bezug auf diese:

<Context::Number:0x000000009b7fd0 @name="three">, # 

... hast du meinen Sie erhalten, wenn Sie puts a[3] und nicht puts a?

Jede Instanz des Objekts und seiner Unterklassen hat eine to_s-Methode, die eine Zeichenfolgendarstellung des Objekts zurückgibt. Da Sie das in Ihrer Number-Klasse nicht überschrieben haben, wurde die in der Klasse Object definierte Standardimplementierung verwendet. Es wird Sie zeigen:

1) die Klassennamen (nehme ich an Sie definierte Anzahl in Seiten eine Klasse oder ein Modul namens Context)

2) die Objekt-ID (eine eindeutige ID in der Ruby-Laufzeit)

3) die Stringdarstellung ihrer Instanzvariable (n)

auch dies in Bezug auf:

a = ["zero", "one","two", "three", "four"] 

Dies entspricht und leichter zu Typs (I verwenden 2 Plätze fo r eine bessere Lesbarkeit):

%w(zero one two three four) 

Auch, wie Ilya darauf hingewiesen, map wird Ihr Code vereinfachen.Ich gehe noch ein wenig weiter und empfehle das zur Initialisierung des Arrays:

a = %w(zero one two three four).map { |s| Number.new(s) } 
+0

Ja, ich meinte, puts a [3]. Danke übrigens, das ziemlich viel meiner Verwirrung aufräumt! wenn ich noch ein paar Fragen stellen kann? Gibt es einen Grund, warum sich die Objekt-ID jedes Mal ändert, wenn ich den Code ausführe? So geschieht es jedes Mal, wenn ich renne und mache 'ein [3]' auch, der Code, den ich in meine Frage eingefügt habe, war die Gesamtheit dessen, was ich geschrieben habe; irgendeine Idee, wie der Klassenname Kontext wurde? –

+0

Objekt-IDs haben an und für sich keine Bedeutung (zum Beispiel werden sie nicht basierend auf dem Inhalt des Objekts berechnet) und existieren nur als ein Wert, mit dem Ruby das Objekt im Speicher identifizieren kann. Es besteht also keine Notwendigkeit oder Garantie, dass sie über die Laufzeit Ihres Programms konsistent sind. –

+0

In Bezug auf 'Context' habe ich keine Ahnung ... ist dies der einzige Code in Ihrer Datei, und führen Sie die Datei direkt in der Befehlszeile aus, wie in' ruby ​​my_file.rb'? Wenn nicht, wie? –

-1

Ja, Sie haben Objekte erstellt. Ruby repräsentiert eine Klasse als String.

class MyClass 
    attr_accessor :one, :two 

    def initialize(one, two) 
    @one, @two = one, two 
    end 
end 

my_class = MyClass.new(1, 2) 

my_class.to_s   # #<MyClass:0x007fcacb8c7c68> 
my_class.inspect   # #<MyClass:0x007fcacb8c7c68 @one=1, @two=2> 
+0

Hey, danke für die Klarstellung! –