2015-06-01 24 views
3

我想在初始化後訪問ruby中的變量,但我沒有得到該變量,有什麼不對嗎?在初始化後訪問ruby中的變量

class Test 
    def initialize(params) 
    @has_test = params[:has_test] 
    @limit_test = params[:limit_test] 
    end 
    def self.method1(params) 
    Test.new(params) 
    #can i get that two instance variable 
    end 
end 
+0

@lurker雖然在技術上''@@是正確的語法的大部分時間,因爲它似乎在這種情況下,類的實例變量會用於代替類變量,儘管我同意他似乎只是錯誤的自我,並希望訪問實例本身的實例變量。 – engineersmnky

+0

@engineersmnky是的,我同意。直到我發表評論之後,我才注意到這一點。 – lurker

+0

Ruby使用'#'來註釋,而不是''''。 –

回答

2

你或許應該設置屬性訪問器,然後用它們這樣:

class Test 
    attr_accessor :has_test 
    attr_accessor :limit_test 

    def initialize(params) 
    @has_test = params[:has_test] 
    @limit_test = params[:limit_test] 
    end 
    def self.method1(params) 
    t = Test.new(params) 
    // can i get that two instance variable 
    // Yes: 
    // use t.has_test and t.limit_test 
    end 
end 
+1

你爲什麼決定把'@ has_test ='改成'self.has_test ='?我能看到這樣做的唯一原因是如果setter執行額外的操作而不是設置實例變量。否則,這會產生一個不必要的附加方法調用。 – engineersmnky

+0

@engineersmnky出於奇想我想。我改回來了。 – lurker

+0

感謝您的信息... – django

1

你混合實例,並在您的示例類方法。 如果這真的是你想要的東西,那麼你必須與attr_reader定義訪問:

class Test 
    def initialize(params) 
    @has_test = params[:has_test] 
    @limit_test = params[:limit_test] 
    end 
    attr_reader :has_test 
    attr_reader :limit_test 
    def self.method1(params) 
    obj = Test.new(params) 
    p obj.has_test 
    p obj.limit_test 
    end 
end 

Test.method1(has_test: 1, limit_test: 3) 

它實例/類方法是錯誤的,那麼這個例子可以幫助你:

class Test 
    def initialize(params) 
    @has_test = params[:has_test] 
    @limit_test = params[:limit_test] 
    end 
    def method1() 
    p @has_test 
    p @limit_test 
    end 
end 

obj = Test.new(has_test: 1, limit_test: 3) 
obj.method1 

如果您還像第一個代碼中那樣定義訪問器,那麼您可以再次從課程外部訪問。


以防萬一你不希望一個讀者,也看到Access instance variable from outside the class