2013-08-06 2 views
-1

Когда я определяю @foo=3 в методе initialize, я ожидаю получить доступ к моей переменной следующим образом.Переменные экземпляра и attr_accessor

class Object 
    def initialize(v) 
    @foo = v 
    end 

    Object.new.foo 

Этого не происходит. Мне нужно написать attr_accessor :foo. Зачем мне это нужно, хотя @ уже делает это для меня?

+3

Я думаю, вы можете быть пропущен 'end' в вашем коде. –

ответ

5

Одна переменная экземпляра в Ruby не является общедоступной по умолчанию. И доступ должен предоставляться на основе аксессуаров.

только для чтения attr_reader Для записи только attr_writer для чтения написать attr_accessor

Он не доступен по умолчанию

4

@ автоматически не сделает это за вас. Вот почему. attr_accessor создает геттеры и сеттеры для ваших переменных экземпляра («@ -variables»).

3

Переменные экземпляра являются частными. Для доступа к ним нужны аксессоры и мутаторы. A/пара общая сбруя мутатор выглядит следующим образом:

def foo 
    @foo 
end 

def foo=(value) 
    @foo=value 
end 

Это создает абстракции, которые теперь можно использовать как:

Classname.new.foo 
Classname.new.foo="OOP" 

Поскольку это такая общая потребность, а также reults в много шаблонного (читай : ненужный), ruby ​​предоставляет динамический метод, который буквально определяет эти два метода для вас.

attr_accessor :foo 

Если вы хотите только один из аксессора или методы мутаторной, а затем использовать соответствующий из следующих действий:

attr_reader :foo 
attr_writer :foo 

Это позволит сэкономить много копирования/вставки. Надеюсь, я поняла.

0

Переменная экземпляра начинается с символа @. Все переменные экземпляра являются частными, что означает, что вы не можете их прочитать, и вы не можете изменить их значение. Так что делать?

class Dog 
    def initialize(name) 
    @name = name 
    end 

    def name #getter 
    @name 
    end 

    def name=(str) #setter 
    @name = str 
    end 
end 

Ну, что добирается, чтобы быть болью, чтобы впечатать, поэтому рубин обеспечивает быстрый доступ:

class Dog 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    end 
end 
1

Всех атрибутов рубин «частный» и невидимы за пределами методов класса. Вам нужны методы доступа для чтения и записи атрибута. Таким образом, в вашем примере, вам нужно

class MyClass 

    def initialize(v) 
    @foo = v 
    end 

    def foo 
    @foo 
    end 

    def foo=(v) 
    @foo = v 
    end 

end 

Тогда MyClass.new(4).foo будет работать, и вернуть 4.

Вы также можете добавить методы доступа с помощью удобных методов

attr_reader :foo 
attr_writer :foo 

или

attr_accessor :foo 
Смежные вопросы