OH! That makes a big difference in usability. :)

On Wednesday, September 21, 2016 at 12:50:26 PM UTC-4, Fengyang Wang wrote:
>
> There is no need to modify a copy; only the Nullable is immutable and not 
> its underlying value. Just instead of modifying ec.title, modify 
> get(ec.title). Like setfield!(get(ec.title), k, v). In short scripts, I 
> often define getindex(x::Nullable) = get(x) so that I can write ec.title[] 
> instead of get(ec.title), but type piracy is bad practice. This method 
> should really be in Base.
>
> On Wednesday, September 21, 2016 at 9:59:21 AM UTC-4, Randy Zwitch wrote:
>>
>> So get() to check if a value is there, and if there is modify a copy 
>> then overwrite?
>>
>> If that's the case, it might be worth the mental overhead to use Nullable 
>> types when mentally I'm viewing everything as a consistently mutating 
>> object until the desired result is achieved.
>>  
>> On Wednesday, September 21, 2016 at 9:49:44 AM UTC-4, Yichao Yu wrote:
>>>
>>> On Sep 21, 2016 9:42 AM, "Randy Zwitch" <randy....@fuqua.duke.edu> 
>>> wrote:
>>> >
>>> > I frequently have a design pattern of Union{Title, Void}. I was 
>>> thinking that I could redefine this as title::Nullable{Title}. However, 
>>> once I try to modify fields inside the Title type using setfield!(ec.title, 
>>> k, v), I get this error message:
>>> >
>>> > LoadError: type Nullable is immutable while loading In[19], in 
>>> expression starting on line 4
>>> >
>>> >
>>> >
>>> > My question is, why is the Nullable type immutable? My original 
>>> thought was that my Nullable definition was saying "There is either a Title 
>>> type here or nothing/missing", and maybe I know the value now or maybe I 
>>> know it later. But it seems the definition is actually "There could be a 
>>> Title type here or missing, and whatever you see first is what you will 
>>> always have"
>>> >
>>> > Is there a better way to express the former behavior other than as a 
>>> Union type? My use case is building JSON strings as specifications of 
>>> graphs for JavaScript libraries, so nearly every field of every type is 
>>> possibly missing for any given specification.
>>>
>>> Assign the whole object instead of mutating it.
>>>
>>> >
>>> > @with_kw type EChart <: AbstractEChartType
>>> >     # title::Union{Title,Void} = Title()
>>> >     title::Nullable{Title} = Title()
>>> >     legend::Union{Legend,Void} = nothing
>>> >     grid::Union{Grid,Void} = nothing
>>> >     xAxis::Union{Array{Axis,1},Void} = nothing
>>> >     yAxis::Union{Array{Axis,1},Void} = nothing
>>> >     polar::Union{Polar,Void} = nothing
>>> >     radiusAxis::Union{RadiusAxis,Void} = nothing
>>> >     angleAxis::Union{AngleAxis,Void} = nothing
>>> >     radar::Union{Radar,Void} = nothing
>>> >     dataZoom::Union{DataZoom,Void} = nothing
>>> >     visualMap::Union{VisualMap,Void} = nothing
>>> >     tooltip::Union{Tooltip,Void} = nothing
>>> >     toolbox::Union{Toolbox,Void} = Toolbox()
>>> >     geo::Union{Geo,Void} = nothing
>>> >     parallel::Union{Parallel,Void} = nothing
>>> >     parallelAxis::Union{ParallelAxis,Void} = nothing
>>> >     timeline::Union{Timeline,Void} = nothing
>>> >     series::Union{Array{Series,1},Void} = nothing
>>> >     color::Union{AbstractVector,Void} = nothing
>>> >     backgroundColor::Union{String,Void} = nothing
>>> >     textStyle::Union{TextStyle,Void} = nothing
>>> >     animation::Union{Bool,Void} = nothing
>>> >     animationDuration::Union{Int,Void} = nothing
>>> >     animationEasing::Union{String,Void} = nothing
>>> >     animationDelay::Union{Int,Void} = nothing
>>> >     animationDurationUpdate::Union{Int,Void} = nothing
>>> >     animationEasingUpdate::Union{String,Void} = nothing
>>> >     animationDelayUpdate::Union{Int,Void} = nothing
>>> > end
>>>
>>

Reply via email to