2017-02-04 13 views
0

ここでRubyを学びます。これはOOPへの私の最初の試みであり、以下はハッシュクラスを作る私の完全なコードです。私はunionメソッドで何が起こっているのか理解できない。 self.to_a.each { |key| joined_set.insert(key) }@store.to_a.each { |key| joined_set.insert(key) }に変更すると、は@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を持っていた場合、その後、@storeself.store

1

に等しくなるあなたは異なる結果を取得している、より具体的な理由は、self.to_a@store.keysに等しいということです。どうして?それはあなたが定義された方法ですのでto_a

def to_a 
    @store.keys 
end 

@store.keys@store.to_aは互いに非常に異なっています。 @storeはルビHashであり、Hash#to_aは配列の配列を返します。各サブ配列はキーと値のペアです([[key1, value1], [key2, value2]]など)。一方、Hash#keysは、キー配列を返します。

関連する問題