2013-02-05 32 views
3

我正在寻找一种方式在红宝石连锁破坏性的方法来更改一个变量的值,但我收到错误说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! 
+2

如果这个工作,3将持有de​​crement_guess_count后的值2!被称为。你不想操纵整数的实例。也许这是一个迹象,guesses_left应该是一个更符合语义的类? – bheeshmar

+0

@bheeshmar但是没有办法让自己引用链接变量,而不是实际的整数值?或者有任何其他远程方式可以做到这一点? – bswinnerton

+0

在适当的位置修改“String”或“Array”(使用bang方法)与修改“Integer”到位有很大不同。 –

回答

8

这是设计。它不是整数的具体情况,所有类的行为都是这样的。对于某些类(例如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 
# ~>    ^

我挑战你找到一种可以进行此操作的语言。 :)

+0

那么有没有办法解决它是我想要做的? – bswinnerton

+1

是的,不是从整型类的实例方法中。 –

+0

Bummer,好的。 – bswinnerton