2017-02-04 72 views
0

在這裏學習Ruby,這是我第一次進入OOP,下面是我完成的一個哈希類的代碼。我無法理解union方法中幕後發生的情況。當我將self.to_a.each { |key| joined_set.insert(key) }更改爲@store.to_a.each { |key| joined_set.insert(key) }時,散列joined_set成爲一個包含鍵和值@store的數組數組,而它僅包含鍵,如果我僅使用self而不使用@store。這種差異如何產生?自我不等於實例變量嗎?自身不等於實例變量嗎?

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

對我來說,好像你在作弊,如果你使用Ruby的'hash'來實現散列。爲什麼不打擾,爲什麼不從使用中使用Ruby? – pjs

+0

請注意,在引用類本身內的實例變量和方法時,說'self.'是多餘的。你可以直接調用你的'to_a'。 – pjs

+0

閱讀一種教程/課程,這是他們在做什麼。 – Jstuff

回答

0

self不等於實例變量。
self等於當前對象,在這種情況下,它將是MyHashSet類的當前實例。
所以@store在這種情況下是self的屬性。

如果您@store有一個attr_accessor,然後@store將等於self.store

1

你得到不同的結果更具體原因是self.to_a等於@store.keys。爲什麼?因爲這是你如何定義to_a

def to_a 
    @store.keys 
end 

@store.keys@store.to_a彼此非常不同; @store是一個紅寶石HashHash#to_a返回一個數組數組,每個子數組是一個鍵值對,如[[key1, value1], [key2, value2]];另一方面,Hash#keys只是返回一組鍵。