【问题标题】:Why can't I change the value of self on Int32为什么我不能在 Int32 上更改 self 的值
【发布时间】:2021-08-11 01:20:36
【问题描述】:

如果我尝试在Int32 上实现一个不会改变self 值的附加方法,它会起作用:

struct Int32
    def double
        self * 2
    end
end

x = Int32.new 2
p! x.double # => 4

但是,一旦我尝试更改self,编译器就会给我一个错误,为什么?有没有办法做到这一点,还是在 Crystal 中完全不可能?

struct Int32
    def six
        self = 6 # This fails
    end
end

我也在StringChar 上试过这个,我得到同样的编译器错误:Error: can't change the value of self

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    Beta Ziliani 的回答很好,着眼于大局。

    对于这个特定的示例,答案实际上非常简单:Crystal 中的原始类型是不可变的。 所以不可能改变原始类型实例的值。变异方法总是必须返回一个 new 值。然后可以将该值再次分配给相同的变量。

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

    【讨论】:

      【解决方案2】:

      答案是:self 是什么?答案取决于班级:

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

      最后,this applies to Ruby too

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多