Подпишитесь на рассылку о самых интересных материалах в мире веб-разработки :)

Метод записи атрибута зачем ?


#1

Вот читаю книгу и немного запутался почему для изменения методов экзепляра везде записано
def name=(value)
def age=(value)
А вот метод move вот так
def move(destination)
почему бы весь код тогда уже не писать без методов записи атрибута ? ssdfsdf=(fsfd)

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")

#2

destination в этом коде ничего не меняет в экземпляре объекта, поэтому не нужен шорткат-метод для соотвествующих полей (name и age).


#3

Подскажиет пожалуйста вот решил попробовать модернизировать код в целях обучения но странно что он не работает уже голову сломал

class Dog
  
   def name=(value)
     if value == ""
       raise "Введите имя, вы не ввели имя"
     end
     @name = value
   end
   def age=(value)
    if value < 0
      raise "An age of #{value} isn't valid!"
    end
    @age = value
   end
   def talk
      puts "#{@name} says Bark!"
   end
   def move=(distantion)
    if value == ""
       raise "Введите куда движется"
    end
     @distantion = value
   end
   def report_age
     puts "#{@name} уже #{@age} лет, она бежит к #{@distantion}"
   end
end
 
dog = Dog.new
dog.name = "Daisy"
dog.age = 5
dog.talk
dog.move = "дереву"
dog.report_age

#4

Все разобрался там моя ошибка логическая спасибо
Подскажите последнее только, вот эти методы это тоже самое что если я буду обьявлять переменные со знаком @
attr_reader
attr_writer
attr_accessor


#5

Да, эти методы нужны именно для этого.
Стоит помнить, что переменные экземпляра @var можно объявлять только внутри метода initialize.


#6

ну почему же я же в нутри класса использую их и не использую initialize, незнаю что это до нее еше не дошел :slight_smile: только 100 страниц осил книги


#7

Я имел в виду если вручную объявлять переменные без attr_* методов.


#8

спасибо я понял ура :slight_smile: часа 2 перечитывал книгу и пытался вьехать что то такое простое очень туго вкуривалось