2013-12-09 2 views
0

Я знаю, что в экземпляре класса я должен читать значения переменных через переменные экземпляра. Но каковы последствия их чтения через себя?Чтение переменных экземпляра с помощью self

См пример ниже:

class Test attr_writer :aa 
    def testing 
    puts @aa 
    puts self.aa <-- what are the consequences if I apply attr_reader :aa and try to read 'aa' via self.aa ? can I read other value by accident? 
    end 

    def self.bb 
    a = self.new 
    a.aa = "111" 
    a.testing 
    end 
end 

Test.bb 
+0

'puts self.aa' - это то же самое, что' puts aa'. Это потому, что 'self' является приемником по умолчанию. Поскольку 'testing' является методом экземпляра, он вызывается экземпляром' Test', поэтому 'self' равно этому экземпляру внутри метода. Вы можете подтвердить, что добавив 'puts 'self = # {self}" 'внутри метода. Эффект 'puts aa' (или' puts self.aa') зависит от того, был ли вы создан аксессуар для 'aa' (например,' attr_reader: aa'). Если у вас есть, 'puts aa' будет давать значение @aa через accessor; если вы этого не сделали, будет создано исключение, информирующее вас о том, что нет локальной переменной или метода 'aa'. –

+0

Хорошо, любая конкретная причина для: «Но использование метода вместо @variable рекомендуется по разным причинам». ? –

ответ

0

В вашем примере переменная является переменной экземпляра в только что созданный с self.new

объекта Также важно знать, что в ссылках testing метод самостоятельно в объект, а не класс, как кажется, вы думаете. И в методе bob, так как это метод класса, self ссылается на класс.

Тем не менее, вы можете иметь переменные экземпляра внутри самого класса (не путать с переменными класса @@, которые доступны для всех объектов класса и самого класса).

Вот пример того, как он может выглядеть.

class Test 

    class << self 
    attr_writer :bb 
    end 

    def self.bb 
    @bb 
    end 
end 

Test.bb = 1 
Test.bb 
+0

Спасибо, что я отредактировал свое сообщение и изменил «класс» на «экземпляр» –

+0

Хорошо, я понимаю, что вы написали, и я понимаю различия, но мне просто интересно, что может пойти не так, если я попытаюсь прочитать переменную, используя self. aa вместо @aa в методе тестирования –

+0

Если вы используете attr_reader: aa - это тот же метод, что и 'def aa; @aa; end', так что это почти то же самое. Но использование метода вместо @variable рекомендуется по разным причинам. –

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