2015-04-01 3 views
-3

Когда я создаю атрибуты, я могу использовать символы, как это:рубин символ и атрибут

class SomeClass 
    attr_reader :variable1, :variable2 
end 

Когда я с помощью ключевого слова attr_reader (или attr_writer) и использовать то же имя некоторой переменной экземпляра, Руби автоматически ассоциирует атрибут (или сказать, свойство) с переменной экземпляра с тем же именем?

+0

Что неясно о ["Создает переменные экземпляра и соответствующие методы, возвращающие значение каждой переменной экземпляра."] (Http://ruby-doc.org/core-2.2.1/Module.html#method -i-attr_reader)? Это прямо из документации 'attr_reader'. –

+0

Это круто, я даже не знал этого веб-сайта. – Alex

ответ

2

Вам нужно понять, что такое attr_reader. Когда вы делаете:

attr_reader :variable1, :variable2 

Это переводится в:

def variable1 
    @variable1 
end 
def variable2 
    @variable2 
end 

Как вы можете видеть variable1 лишь экземпляр переменной @variable1, значение которого вы устанавливаете в вашем методе initialize.

Итак, Ruby связывает атрибут с переменной экземпляра с тем же именем.

0

Нет, ассоциации не существует.

И attr_reader, attr_writer, attr_accessor не являются ключевыми словами, это методы, как и любой другой метод. На самом деле, вы можете легко написать их самостоятельно:

class Module 
    def attr_reader(*attrs) 
    attrs.each do |attr| 
     define_method(attr) { instance_variable_get(:"@#{attr}") } 
    end 
    end 

    def attr_writer(*attrs) 
    attrs.each do |attr| 
     define_method(:"#{attr}=") do |val| instance_variable_set(:"@#{attr}", val) end 
    end 
    end 

    def attr_accessor(*attrs) 
    attr_reader *attrs 
    attr_writer *attrs 
    end 
end 

Все, что эти методы сделать, порождают какие-то другие методы, чье имя основано на символе вы передаете в них. Вот и все.

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