2015-06-01 1 views
3

Я пытаюсь получить доступ к переменной в ruby ​​после инициализации, но я не получил эту переменную, что-то не так?Доступ к varible в 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 ='? единственная причина, по которой я могу это сделать, заключается в том, что сеттер выполняет дополнительные операции за пределами установки переменной экземпляра. В противном случае это делает вызов метода добавления ненужным. – 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

Смежные вопросы