Почему переменные экземпляра могут быть изменены через считыватель полей с помощью оператора <<? - PullRequest
0 голосов
/ 13 ноября 2018

Рассмотрим следующий класс.

class Test
  attr_reader :word
  def initialize(word)
    @word = word
  end

  def append_word(token)
    word << token
  end
end

Рассмотрим пример использования класса.

2.4.0 :001 > t = Test.new('Hello')
 => #<Test:0x007f7f09902970 @word="Hello"> 
2.4.0 :002 > t.append_word(' world!')
 => "Hello world!" 
2.4.0 :003 > t.word
 => "Hello world!" 
2.4.0 :004 > 

Я новичок в Ruby. Я не понимаю, почему я могу использовать метод экземпляра append_word для изменения переменной экземпляра @word экземпляра Test. word в append_word похоже на читателя поля. Насколько я понимаю, полевой читатель предназначен только для чтения. Как word << token в append_word может изменить значение @word в экземпляре теста?

1 Ответ

0 голосов
/ 13 ноября 2018

Ваш @word ссылается на объект в памяти. Этот объект является строкой Hello!. Ваш класс не позволяет (легко) установить новый объект для переменной экземпляра @word, но в настоящее время ничто не мешает вам изменить объект напрямую. Если вы хотите, чтобы объект не был изменяемым, вы можете .freeze it:

class Test
  attr_reader :word
  def initialize(word)
    @word = word.freeze
  end

  def append_word(token)
    word << token
  end
end

> Test.new("Hello").append_word("world!")
# FrozenError (can't modify frozen String)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...