如果使用<<,Ruby attr_reader允许修改字符串变量

Rob*_*bin 6 ruby instance-variables

进入一些奇怪的行为,并想知道是否有其他人可以确认我所看到的.

假设您使用成员变量创建一个类,并允许使用attr_reader读取它.

class TestClass
  attr_reader :val

  def initialize(value)
   @val = value
  end
end
Run Code Online (Sandbox Code Playgroud)

现在当我执行以下操作时,它似乎修改了@val的值,即使我只授予它读取权限.

test = TestClass.new('hello')
puts test.val
test.val << ' world'
puts test.val
Run Code Online (Sandbox Code Playgroud)

这回来了

hello
hello world
Run Code Online (Sandbox Code Playgroud)

这只是我在irb中进行的一些测试的结果,所以不确定是否总是如此

Ste*_*eve 6

你并没有真正写出val属性.您正在阅读它并在其上调用一个方法('<<'方法).

如果您想要一个阻止您描述的修改类型的访问器,那么您可能希望实现一个返回@val副本而不是使用attr_reader的方法.