为什么我不能在 Int32 上更改 self 的值



如果我尝试实现一个额外的方法,它不改变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

我也尝试过StringChar,我得到相同的编译器错误:Error: can't change the value of self

Beta Ziliani的答案很好,而且着眼于大局。

对于这个特殊的例子,答案实际上很简单:Crystal中的基本类型是不可变的。因此,不可能更改基本类型实例的值。变化的方法总是必须返回一个新的值。然后可以将该值再次赋值给相同的变量。

一种解决方法是将原语包装在结构体中。或者作为一种不安全的替代方法,您可以将指向具有原始值的变量的指针传递给方法。然后,该方法可以为该指针赋值。

答案是:什么是self?答案取决于类:

  • 如果它是Value(Int32,Char),那么它的值(你想要改变的)在传递时被复制:在内存中没有一个地方你可以去执行更改。
  • 如果它是Reference(String和大多数用户定义的类),那么self是指向对象的指针。这意味着,如果你能够改变self,你是在修改指针,而不是它的内容。

最后,这也适用于Ruby。

相关内容

  • 没有找到相关文章

最新更新