2017-02-04 5 views
0

Ich lerne Ruby hier und das ist meine erste Bemühung in OOP und unten ist mein vollständiger Code, der eine Hash-Klasse macht. Ich habe Probleme zu verstehen, was hinter den Kulissen in der Methode passiert. Wenn ich self.to_a.each { |key| joined_set.insert(key) } zu @store.to_a.each { |key| joined_set.insert(key) } ändere, wird der Hash joined_set ein Array von Arrays, die die Schlüssel und Werte von @store enthalten, während es nur die Schlüssel enthält, wenn ich nur self und nicht @store verwende. Wie entsteht diese Diskrepanz? Ist self nicht gleich der Instanzvariable?Ist self nicht gleich der Instanzvariable?

class MyHashSet 
    def initialize 
    @store = {} 
    end 

def insert(el) 
    @store[el] = true 
end 

def include?(el) 
    return true if @store[el] 
false 
end 

def delete(el) 
    if @store[el] 
     @store.delete(el) 
     return true 
    else 
     return false 
    end 
    end 

    def to_a 
    @store.keys 
    end 

    def union(set2) 
    joined_set = self.class.new 
    self.to_a.each { |key| joined_set.insert(key) } 
    set2.to_a.each { |key| joined_set.insert(key) } 
    joined_set 
    end 

end 
+0

Scheint mir, als ob Sie betrügen, wenn Sie Ruby's 'Hash' verwenden, um einen Hash zu implementieren. Warum sollten Sie sich kümmern, warum benutzen Sie Ruby nicht von Anfang an? – pjs

+0

Beachten Sie, dass das Aussprechen von "self." überflüssig ist, wenn Sie auf Instanzvariablen und Methoden innerhalb der Klasse selbst verweisen. Sie können Ihr 'to_a' direkt aufrufen. – pjs

+0

Durch eine Art Tutorial/Klasse gehen und das haben sie uns zu tun. – Jstuff

Antwort

0

self ist ungleich der Instanzvariablen.
self ist gleich dem aktuellen Objekt, das in diesem Fall die aktuelle Instanz der MyHashSet-Klasse wäre.
so @store ist ein Attribut von self in diesem Fall.

, wenn Sie ein attr_accessor für @store haben, dann würde @store-self.store

1

Je mehr spezifische Grund unterschiedliche Ergebnisse gleich ist, Sie bekommen, dass self.to_a zu @store.keys gleich ist. Warum? denn das ist, wie Sie definiert to_a:

def to_a 
    @store.keys 
end 

@store.keys und @store.to_a sind sehr verschieden voneinander sind; @store ist ein Ruby Hash, und Hash#to_a gibt ein Array von Arrays zurück, wobei jedes Subarray ein Schlüssel/Wert-Paar ist, wie [[key1, value1], [key2, value2]]; Hash#keys hingegen gibt nur ein Array von Schlüsseln zurück.

Verwandte Themen