It seems a bit misleading to call that method simply "unsafe" when in reality it is pretty much guaranteed to corrupt your entire application. On Sun, Jun 7, 2015 at 1:13 PM Jonathan Malmaud <malm...@gmail.com> wrote:
> I did implement an extremely hacky approach to force the type of an object > to change, and it may fail in some situations, but it works well enough: > > https://github.com/malmaud/Autoreload.jl/blob/master/src/smart_types.jl#L288 > > > On Sunday, June 7, 2015 at 11:53:03 AM UTC-4, Simon Byrne wrote: >> >> No, you can't change the type of an object. >> >> You can however define types with fields that aren't constrained to be of >> a concrete type: while this is worse for performance, it is occasionally >> useful, e.g. >> >> type A >> a::Union(Void, Int) >> end >> >> A(nothing).a = 1 >> >> On Saturday, 6 June 2015 23:49:53 UTC+1, andrew cooke wrote: >>> >>> >>> Is there any way to switch the "visible" type - the thing that is >>> dispatched on - at runtime? >>> >>> For example, you might think that a Union() could do this, but the >>> "visible" type is either always be the Union, and not either of the >>> subtypes, or doesn't allow the value to be changed. >>> >>> julia> type A{T<:Union(Void,Int)} a::T end >>> >>> julia> A(1) >>> A{Int64}(1) >>> >>> julia> A(nothing) >>> A{Void}(nothing) >>> >>> julia> A(nothing).a = 1 >>> ERROR: ... >>> >>> julia> A{Union(Void,Int)}(nothing).a = 1 >>> 1 >>> >>> Not sure if those examples make things clear, but when the type of A is >>> explicitly A{Void} then the contents cannot be changed to an Int. And if >>> the type is explicitly A{Union(...)} then the value can be changed, but the >>> "visible" type remains the Union and cannot be dispatched on. >>> >>> Thanks, >>> Andrew >>> >>> >>> >>>