如果我尝试实现一个额外的方法,它不改变self
的值,在Int32
上它工作:
struct Int32
def double
self * 2
end
end
x = Int32.new 2
p! x.double # => 4
然而,只要我试图改变self
编译器给我一个错误,为什么?有办法做到这一点,还是完全不可能在水晶?
struct Int32
def six
self = 6 # This fails
end
end
我也尝试过String
和Char
,我得到相同的编译器错误:Error: can't change the value of self
Beta Ziliani的答案很好,而且着眼于大局。
对于这个特殊的例子,答案实际上很简单:Crystal中的基本类型是不可变的。因此,不可能更改基本类型实例的值。变化的方法总是必须返回一个新的值。然后可以将该值再次赋值给相同的变量。
一种解决方法是将原语包装在结构体中。或者作为一种不安全的替代方法,您可以将指向具有原始值的变量的指针传递给方法。然后,该方法可以为该指针赋值。答案是:什么是self
?答案取决于类:
- 如果它是
Value
(Int32
,Char
),那么它的值(你想要改变的)在传递时被复制:在内存中没有一个地方你可以去执行更改。 - 如果它是
Reference
(String
和大多数用户定义的类),那么self
是指向对象的指针。这意味着,如果你能够改变self
,你是在修改指针,而不是它的内容。
最后,这也适用于Ruby。