當我創建屬性,我可以使用這樣的符號:紅寶石符號和屬性
class SomeClass
attr_reader :variable1, :variable2
end
當我使用關鍵字attr_reader
(或attr_writer
),並使用相同的名稱一些實例變量, Ruby是否會自動將屬性(或者說,屬性)與具有相同名稱的實例變量關聯?
當我創建屬性,我可以使用這樣的符號:紅寶石符號和屬性
class SomeClass
attr_reader :variable1, :variable2
end
當我使用關鍵字attr_reader
(或attr_writer
),並使用相同的名稱一些實例變量, Ruby是否會自動將屬性(或者說,屬性)與具有相同名稱的實例變量關聯?
您需要了解attr_reader
的功能。當你這樣做:
attr_reader :variable1, :variable2
它被翻譯成:
def variable1
@variable1
end
def variable2
@variable2
end
正如你可以看到variable1
只是實例變量@variable1
其值你是你的initialize
方法中的設置。
所以,是的,Ruby確實將該屬性與具有相同名稱的實例變量相關聯。
不,沒有關聯。
而attr_reader
,attr_writer
,attr_accessor
不是關鍵字,它們就像任何其他方法一樣。事實上,你可以很容易地自己編寫:
class Module
def attr_reader(*attrs)
attrs.each do |attr|
define_method(attr) { instance_variable_get(:"@#{attr}") }
end
end
def attr_writer(*attrs)
attrs.each do |attr|
define_method(:"#{attr}=") do |val| instance_variable_set(:"@#{attr}", val) end
end
end
def attr_accessor(*attrs)
attr_reader *attrs
attr_writer *attrs
end
end
所有這些方法做的,就是產生一些其他的方法,其名稱是根據你傳遞到他們的標誌。而已。
關於[「創建實例變量和返回每個實例變量值的相應方法」)的含義尚不清楚。](http://ruby-doc.org/core-2.2.1/Module.html#method -i-attr_reader)?這是'attr_reader'文檔的直接結果。 – 2015-04-01 03:54:25
這很酷,我甚至都不知道那個網站。 – Alex 2015-04-01 04:03:16