@RaMzz

Почему у меня есть доступ к атрибуту метода экзепляра?

Читаю книгу и уже на сотой странице оказался в тупике не пойму почему я могу изменить атрибут метода экзепляра
class Dog
    attr_reader :name, :age
   def name=(value)
     if value == ""
       raise "Name can't be blank!"
     end
     @name = value
   end
   def age=(value)
    if value < 0
      raise "An age of #{value} isn't valid!"
    end
    @age = value
   end
   def move(destination)
      puts "#{@name} runs to the #{destination}."
   end
   def talk
     puts "#{@name} says Bark!"
   end
   def report_age
     puts "#{@name} is #{@age} years old."
   end
end
dog = Dog.new
dog.name = "Daisy"
dog.age = 3
dog.report_age
dog.talk
dog.move("bad")

как же так я я могу просто задать Атрибут в методе move ведь он находится в классе
def move(destination)
вот этой строкой я просто присваиваю атрибут
dog.move("bad")
почему же я не могу сделать это с name
Запутался вобщем помогите разобраться..

Не много проясняется но не могу понять почему же первые два метода записаны так
def name=(value)
     if value == ""
       raise "Name can't be blank!"
     end
     @name = value
   end
   def age=(value)
    if value < 0
      raise "An age of #{value} isn't valid!"
    end

def name=(value)
def age=(value)
А вот метод
def move(destination)
вот так без равно =
  • Вопрос задан
  • 63 просмотра
Решения вопроса 2
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
attr_reader :name не про задание прав чтения. Это просто короткая запись для объявления метода, все что он делает, это сам объявляет метод для чтения, аналог

def name
  @name
end


attr_writer :name объявляет

def name=(value)
  @name = value
end


attr_accessor :name объявит сразу оба метода. move у Вас это уже метод, который работает с внутренними данными, он инкапсулирует их. Поэтому он объявлен как метод.

На самом деле в руби все методы, в руби извне нельзя прочитать атрибут без объявленых методов. move же похож на просто метод, привычный из других ЯП. Его задача скрыть внутреннюю амплементацию класса и предоставить интерфес для работы с ним
Ответ написан
@RaMzz Автор вопроса
я считал до этого момента что в методе эксзепляра класса я не смогу задать атрибут
если он не будет обьявлен вначале с помощью
attr_writer :destination
attr_accessor :destination

или вот так
def move=(destination)
но как оказалось это не обезательно и я делаю
dog.move("bad")
и все работает
хотя записан он там
def move(destination)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы