代码之家  ›  专栏  ›  技术社区  ›  dgo.a

类的实例变量是如何在Crystal中实现的?

  •  1
  • dgo.a  · 技术社区  · 7 年前

    如果我有一个 A 实例变量是否实现为指针?换句话说,即使在使用结构时,实例变量是否也可以通过引用访问?

    class A
      @title = "the title"
      @my_val = MyStruct.new
    end
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Vitalii Elenhaupt    7 年前

    @my_val 是对实例的引用 MyStruct 在堆栈上。检查此示例并注意差异:

    struct MyStruct
      property x
    
      def initialize(@x : Int32)
      end
    end
    
    class A
      getter my_val = MyStruct.new(10)
    end
    
    
    # mutates a struct (passed by reference)
    def method(a : A)
      a.my_val.x = 20
    end
    
    # does not mutate a struct (passed by value)
    def method(s : MyStruct)
      s.x = 30
    end
    
    a = A.new
    p a.my_val.x       #=> 10
    
    a.method(a)
    p a.my_val.x       #=> 20
    
    a.method(a.my_val)
    p a.my_val.x       #=> 20 (not 30)