Делает ли attr_reader локальную переменную доступной в классе?

Почему type переменная доступна в is_a_peacock? метод в следующем?

class Animal
    attr_reader :type

    def initialize(type)
        @type = type
    end

    def is_a_peacock?
        if type == "peacock"
            return true
        else
            return false
        end
    end
end

an = Animal.new('peacock')
puts an.is_a_peacock? # => true

Почему комментирует инициализацию @type делать type недоступен?

class Animal
    attr_reader :type

    def initialize(type)
        #@type = type
    end

    def is_a_peacock?
        if type == "peacock"
            return true
        else
            return false
        end
    end
end

an = Animal.new('peacock')
puts an.is_a_peacock? # => false

3 ответа

Решение

"Зачем комментировать инициализацию @type делать type недоступен?"

Это не. метод type доступен. Просто не инициализирован. Потому что ты это закомментировал.

Если метод type не было доступно, ваша программа зависала. (Как это происходит, когда вы комментируете attr_reader).

Вы можете думать о attr_reader :type как делать это для вас:

def type
  @type
end

Но он не присваивает переменные экземпляра автоматически на основе того, что вы передаете в инициализатор, как вы, кажется, предполагаете, что это будет делать.

Так как вы больше не делаете @type = type, @type остается по умолчанию значение nil, Каждая переменная экземпляра по умолчанию равна nil.

На заметку, вместо

   if type == "peacock"
        return true
    else
        return false
    end

ты можешь написать просто

   type == "peacock"

Почему type переменная доступна в is_a_peacock? метод в следующем?

Ваше предположение на этот вопрос не имеет места. type внутри тела метода is_a_peacock? не является локальной переменной Это вызов метода.

Почему комментирует инициализацию @type делать type недоступен?

Это не. Метод type доступно, что возвращает значение @type, который nil по умолчанию.

Другие вопросы по тегам