我正在寻找一种方式在红宝石连锁破坏性的方法来更改一个变量的值,但我收到错误说Can't change the value of self
。这在Ruby中是不可能的吗?无法修改自己在红宝石的整数
guesses_left = 3
class Integer
def decrement_guess_count!
self -= 1
end
end
guesses_left.decrement_guess_count!
我正在寻找一种方式在红宝石连锁破坏性的方法来更改一个变量的值,但我收到错误说Can't change the value of self
。这在Ruby中是不可能的吗?无法修改自己在红宝石的整数
guesses_left = 3
class Integer
def decrement_guess_count!
self -= 1
end
end
guesses_left.decrement_guess_count!
这是设计。它不是整数的具体情况,所有类的行为都是这样的。对于某些类(例如String
),可以更改状态的一个实例(这称为破坏性操作),但不能完全替换该对象。对于整数你甚至不能改变状态,它们没有任何改变。
如果我们愿意允许这样的事情,那就会引发很多难题。说,如果foo
引用bar1
,我们用bar2
替代,该怎么办? foo
应该一直指向bar1
?为什么?为什么它不应该?如果bar2
具有完全不同的类型,bar1
的用户应该如何对此做出反应?等等。
class Foo
def try_mutate_into another
self = another
end
end
f1 = Foo.new
f2 = Foo.new
f1.try_mutate_into f2
# ~> -:3: Can't change the value of self
# ~> self = another
# ~> ^
我挑战你找到一种可以进行此操作的语言。 :)
如果这个工作,3将持有decrement_guess_count后的值2!被称为。你不想操纵整数的实例。也许这是一个迹象,guesses_left应该是一个更符合语义的类? – bheeshmar
@bheeshmar但是没有办法让自己引用链接变量,而不是实际的整数值?或者有任何其他远程方式可以做到这一点? – bswinnerton
在适当的位置修改“String”或“Array”(使用bang方法)与修改“Integer”到位有很大不同。 –