This is just blowing my mind.  Can anyone explain it?

To be clear - adding the {N} means that the "copy constructor" no longer 
copies.  See how mutating Foo alters both "instanced", and they both have 
the same object reference.


andrew@laptop:~/.julia/v0.4/GoCL> julia-0.4
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.4.1-pre+22 (2015-11-01 00:06 UTC)
 _/ |\__'_|_|_|\__'_|  |  Commit 669222e (6 days old release-0.4)
|__/                   |  x86_64-suse-linux

julia> immutable Foo{N}
         a
         Foo() = new(zeros(UInt8, N)) 
         Foo(x::Foo) = new(copy(x.a)) 
       end

julia> f = Foo{2}()
Foo{2}(UInt8[0x00,0x00])

julia> f2 = Foo(f)
Foo{2}(UInt8[0x00,0x00])

julia> immutable Bar
         a
         Bar() = new(zeros(UInt8, 2)) 
         Bar(x::Bar) = new(copy(x.a)) 
       end

julia> b = Bar()
Bar(UInt8[0x00,0x00])

julia> b2 = Bar(b)
Bar(UInt8[0x00,0x00])

julia> for x in (f, f2, b, b2)
          println(x)
          println(pointer_from_objref(x))
       end
Foo{2}(UInt8[0x00,0x00])
Ptr{Void} @0x00007f5f10d6eb20
Foo{2}(UInt8[0x00,0x00])
Ptr{Void} @0x00007f5f10d6eb20
Bar(UInt8[0x00,0x00])
Ptr{Void} @0x00007f5f1031e530
Bar(UInt8[0x00,0x00])
Ptr{Void} @0x00007f5f10e85f80

julia> f.a[1] = 7
7

julia> f2
Foo{2}(UInt8[0x07,0x00])

julia> b.a[1] = 7
7

julia> b2
Bar(UInt8[0x00,0x00])



Reply via email to