>
> Is x = copy(y) the same as x = y for immutables??
For this question the @which macro is very useful. It tells you that
julia> @which copy(1)
copy(x::Union(AbstractString,TopNode,LambdaStaticData,(Any...,),Symbol,DataType,UnionType,Function,QuoteNode,Number))
at operators.jl:174
and that definition is just a no-up, so the answer is yes for the types in
that defintion.
Is there a better way using dispatch? Something like SetMax!{K<Immutable,
> V<Mutable}
I have often wanted to dispatch of Mutable/Immutable, but these properties
go across of the declared type tree. My understand is that the declared
subtype relation will also in the future be restricted to have one
supertype, i.e. a tree structure, and therefore it doesn't seem likely that
you'll be able to write a type the way you proposed.
2014-12-30 8:56 GMT+01:00 Greg Plowman <[email protected]>:
>
> I am trying to define a composite type for holding pairs (similar to Dict,
> I suppose), where I keep track of a max key and associated value.
>
> I want to define a function that checks and sets new max as below:
>
>
> type MaxPair{K,V}
> key::K
> value::V
> end
>
> function SetMax!{K,V}(pair::MaxPair{K,V}, key::K, value::V)
> if key > pair.key
> copy!(pair.key, key)
> copy!(pair.value, value)
> end
> return pair
> end
>
> I originally had:
> pair.key = copy(key)
> pair.value = copy(value)
> which worked fine, but in my case key is usually Int, and value is some
> sort of array (or possibly composite type).
>
> For efficiency I thought the in-place copy!() would be better, but copy!()
> is not defined for Int (presumably for immutable types in general).
> I could of course, use
> pair.key = copy(key) # should this just be pair.key = key for immutables
> copy!(pair.value, value)
>
> Is x = copy(y) the same as x = y for immutables??
>
> but in an effort to keep type general, I thought the following might work
>
> function SetMax!{K,V}(pair::MaxPair{K,V}, key::K, value::V)
> if key > pair.key
> if isimmutable(pair.key)
> pair.key = key
> else
> copy!(pair.key, key)
> end
>
> if isimmutable(pair.value)
> pair.value = value
> else
> copy!(pair.value, value)
> end
> end
> return pair
> end
>
> Is anything wrong with this?
>
> Is there a better way using dispatch?
> Something like SetMax!{K<Immutable, V<Mutable}
>
> Thanks, Greg
>
>