2017-09-30 11 views
0

私はRubyクラスとattr_accessorに付属の自動生成ゲッタとセッタを理解しようとしていました。下のコードはどうやって入手できますが、設定することはできません。さらに、後でコード内で私のstoreインスタンス変数の設定を行います(図示せず)。私はread hereから、それはattr_accessorと思われます。私は読み書きするのが簡単です。何attr_accessorRubyクラスの変数設定のためにattr_accessorが機能しません

class HashMap 
    attr_accessor :store, :num_filled_buckets, :total_entries 

    def initialize(num_buckets=256) 
     @store = [] 
     @num_filled_buckets = 0 
     @total_entries = 0 
     (0...num_buckets).each do |i| 
      @store.push([]) 
     end 
     @store 
    end 

    def set(key, value) 
     bucket = get_bucket(key) 
     i, k, v = get_slot(key) 

     if i >= 0 
      bucket[i] = [key, value] 
     else 
      p num_filled_buckets # <- this works 
      num_filled_buckets = num_filled_buckets + 1 if i == -1 # this does not 
      # spits out NoMethodError: undefined method `+' for nil:NilClass 
      total_entries += 1 
      bucket.push([key, value]) 
     end 
    end 
... 

答えて

0

:num_filled_bucketsはあなたを与えるには、二つの方法、リーダライタ

def num_filled_buckets 
    @num_filled_buckets 
end 

def num_filled_buckets=(foo) 
    @num_filled_buckets = foo 
end 

インスタンス変数@num_filled_bucketsを返す読み取り方法です。 @num_filled_bucketsに書き込む引数をとる書き込みメソッド

私は以下のクラスの単純化バージョンを用意しました。

class HashMap 
    attr_accessor :num_filled_buckets 

    def initialize(num_of_buckets=256) 
    @num_filled_buckets = 0 
    end 

    def set 
    p num_filled_buckets #calls the reader method num_filled_buckets 
    p @num_filled_buckets #instance variable @num_filled_buckets 
    @num_filled_buckets = @num_filled_buckets + 1 
    p @num_filled_buckets 
    end 
end 

hm = HashMap.new 
hm.set 
# will output 
# 0 
# 0 
# 1 
関連する問題