2012-12-19 46 views
20

在Ruby中,實例變量有attr,attr_reader,attr_writer,attr_accessor四種不同的getter和setter方法。問題是,在Ruby attr :dilithium中,是否與attr_reader :dilithium相同,如果傳遞了附加參數true,則與attr_accessor :dilithium相同?也就是說是attr vs attr_accessor

class Enterprise 
    attr :dilithium, true 

相同

class Enterprise 
    attr_accessor :dilithium 

是兩個功能attrattr_accessor或多或少冗餘?

回答

27

一個區別是attr_accessor和朋友更清楚,並且attr的可選布爾參數現在已被棄用。除此之外,以及attr沒有文檔的事實,並沒有真正的區別。

+2

'attr'確實有文檔,至少在2.3.0。它只是'attr_reader'的別名。儘管文檔的組織方式很差,但也許可以通過改進來更清楚地說明問題。 – ioquatix

6

在Ruby 1.8中,attr只能定義一個屬性,用可選的true來創建一個setter。在1.9中它的行爲如同attr_reader:它允許多個屬性。正如@Linuxios所說,可選的布爾值已被棄用。

1

如果您查看Ruby 2.3.0中的C代碼,您會看到attrattr_reader實際上是在做同樣的事情(除了棄用的代碼路徑)。它們基本上是等同的功能。

對我來說,主要的區別是:

attr更容易寫下來,因爲它是短了一點。我也喜歡它在功能/不可變編程環境中的感覺(在這些情況下,attr_writerattr_accessor是無關緊要的,因此使用attr_reader會感覺冗長和冗長)。

attr帶有多個實例變量使得它很難記錄,除非在特定的情況下,例如,

# The coordinates in WGS84. 
attr :x, :y 

# The location name. 
attr :name 

# The popularity of the location. 
attr :popularity 

這將是困難,如果他們在同一行attr :name, :popularity獨立記錄:name:popularity

除此之外,它歸結爲個人喜好。實際上沒有性能差異或任何其他差異。