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])