問題

Ruby有這種方便的方法來透過使用鍵共享例項變數,如

 attr_accessor :var
attr_reader :var
attr_writer :var
 

如果我可以簡單地使用attr_accessor,為什麼我會選擇attr_readerattr_writer?是否有類似的效能(我懷疑)?我想有一個原因,否則他們不會製作這樣的鍵.

  最佳答案

您可以使用不同的訪問器將您的意圖傳達給讀取程式碼的人,並使編寫能夠正常工作的類更容易,無論如何呼叫它們的公共 API。

 class Person
  attr_accessor :age
  ...
end
 

在這裡,我可以看到我既可以閱讀也可以寫年齡。

 class Person
  attr_reader :age
  ...
end
 

在這裡,我可以看到我只能讀取年齡.想象一下,它是由這個類的建構函式設定的,然後保持不變.如果年齡有一個mutator(作者),並且類被編寫,假設年齡一旦設定,不會更改,那麼呼叫該mutator的程式碼可能會導致錯誤.

但幕後發生了什麼?

如果你寫:

 attr_writer :age
 

這被翻譯成:

 def age=(value)
  @age = value
end
 

如果你寫:

 attr_reader :age
 

這被翻譯成:

 def age
  @age
end
 

如果你寫:

 attr_accessor :age
 

這被翻譯成:

 def age=(value)
  @age = value
end

def age
  @age
end
 

知道這一點,這裡有另一種思考方法:如果你沒有attr_...幫助,並且必須自己寫訪問器,你會寫出比你的課程所需要的更多的訪問器嗎?例如,如果年齡只需要讀,你還會寫一個允許寫它的方法嗎?

  相同標籤的其他問題

ruby