Tim, Isn't there an inefficiency here though? If my immutable had thirty fields and I wanted to change the second field for each instance in an array of 1M elements, I would have to read/write the whole array instead of just writing one out of every thirty elements.
Cédric On Tue, May 10, 2016 at 9:42 PM, Tim Holy <tim.h...@gmail.com> wrote: > The right way to think about it is that an immutable is like a number: > you're > used to being able to have an array of Float64 and replace those, right? > You're not redefining the meaning of "5.2", you're overwriting the value > stored > in that slot. Arrays of immutables work exactly the same way: the > container is > not immutable, but the individual values stored in it are. That doesn't > prevent you from replacing them. > > Best, > --Tim > > On Tuesday, May 10, 2016 08:43:04 PM Boylan, Ross wrote: > > But if I make an array of immutables I won't be able to change them > > afterwards. Though I can replace them. > > > > With the old code except for > > > > immutable Stuff > > a::Int > > b::Int > > end > > > > I now have > > julia> v=Array(TT.Stuff, 2) > > 2-element Array{TT.Stuff,1}: > > TT.Stuff(140124021836848,140124000460928) > > TT.Stuff(140124048730192,0) > > > > julia> v[1].a=44 # what I'd like to do > > ERROR: type Stuff is immutable > > > > julia> v[1]=TT.Stuff(3, 4) # work-around > > TT.Stuff(3,4) > > > > !julia> v > > 2-element Array{TT.Stuff,1}: > > TT.Stuff(3,4) > > TT.Stuff(140124048730192,0) > > > > With immutable, is everything in the array laid out contiguous in memory? > > It seems sort of odd that the type is immutable yet I can overwrite data > of > > that type. I suppose that would only be prohibited if the array were > > immutable. > > > > Thanks for the tip about using Type to get the zero to work. > > Ross > > > > ________________________________ > > From: julia-users@googlegroups.com [julia-users@googlegroups.com] on > behalf > > of Cedric St-Jean [cedric.stj...@gmail.com] Sent: Tuesday, May 10, 2016 > > 1:20 PM > > To: julia-users > > Subject: [julia-users] Re: newbie questions (was undefined reference > error) > > > > "normal" types are by definition heap-allocated, and are always > manipulated > > them through pointers. What you want is > > immutables< > http://docs.julialang.org/en/release-0.4/manual/types/#immutable > > -composite-types> > > > > immutable Stuff > > a::Int > > b::Int > > end > > > > # Also, for zeros to work, > > > > function zero(x::Type{Stuff}) > > Stuff(0, 0) > > end > > > > > > On Tuesday, May 10, 2016 at 4:04:37 PM UTC-4, Boylan, Ross wrote: > > I'm puzzled that a type consisting only of 2 integers doesn't qualify > as > > "bitstype". Further experiment shows that the array seems to be an array > > of references, I don't know how to implement zero, and generally that > I'm a > > bit lost :) My goal is to get a densely packed array of data. I assume > > that will use less memory and generate faster code; if not, maybe I > should > > change my goal. > > > > BTW, my real use has a type more heterogeneous than 2 Int's, so a > solution > > that uses a 2D array doesn't really generalize appropriately for me. > > > > module TT > > import Base.zero > > > > type Stuff > > a::Int > > b::Int > > end > > > > function zero(x::Stuff) > > Stuff(0, 0) > > end > > > > end > > > > julia> v=Array(TT.Stuff, 3) #as before > > 3-element Array{TT.Stuff,1}: > > #undef > > #undef > > #undef > > > > julia> s=TT.Stuff(3, 5) > > TT.Stuff(3,5) > > > > julia> v=fill(s, 2) > > 2-element Array{TT.Stuff,1}: > > TT.Stuff(3,5) > > TT.Stuff(3,5) > > > > julia> s.a=900 > > 900 > > > > julia> v ###OOPS: every array element points to the same instance > > 2-element Array{TT.Stuff,1}: > > TT.Stuff(900,5) > > TT.Stuff(900,5) > > > > julia> zero(TT.Stuff) # This is probably what needs to work for > zeros() to > > work ERROR: MethodError: `zero` has no method matching > > zero(::Type{TT.Stuff}) > > > > !julia> zero(TT.Stuff(1, 1)) # this at least calls the right c'tor > > TT.Stuff(0,0) > > > > Ross > > ________________________________________ > > From: julia...@googlegroups.com<UrlBlockedError.aspx> > > [julia...@googlegroups.com<UrlBlockedError.aspx>] on behalf of Lutfullah > > Tomak [tomak...@gmail.com<UrlBlockedError.aspx>] Sent: Tuesday, May 10, > > 2016 12:04 AM > > To: julia-users > > Subject: [julia-users] undefined reference error > > > > You need to initialize array entries if you don't have eltype as > bitstype. > > Here, undefined reference means you had not initialize the entry. And, > full > > type assignment works because it initializes the entry. > >