2015-04-01 96 views
-3

當我創建屬性,我可以使用這樣的符號:紅寶石符號和屬性

class SomeClass 
    attr_reader :variable1, :variable2 
end 

當我使用關鍵字attr_reader(或attr_writer),並使用相同的名稱一些實例變量, Ruby是否會自動將屬性(或者說,屬性)與具有相同名稱的實例變量關聯?

+0

關於[「創建實例變量和返回每個實例變量值的相應方法」)的含義尚不清楚。](http://ruby-doc.org/core-2.2.1/Module.html#method -i-attr_reader)?這是'attr_reader'文檔的直接結果。 – 2015-04-01 03:54:25

+0

這很酷,我甚至都不知道那個網站。 – Alex 2015-04-01 04:03:16

回答

2

您需要了解attr_reader的功能。當你這樣做:

attr_reader :variable1, :variable2 

它被翻譯成:

def variable1 
    @variable1 
end 
def variable2 
    @variable2 
end 

正如你可以看到variable1只是實例變量@variable1其值你是你的initialize方法中的設置。

所以,是的,Ruby確實將該屬性與具有相同名稱的實例變量相關聯。

0

不,沒有關聯。

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 

所有這些方法做的,就是產生一些其他的方法,其名稱是根據你傳遞到他們的標誌。而已。