2015-06-01 23 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