One of my favorite tricks broken by Julia v1.0
Aug 18, 2018 · 161 words · 1 minute read
In Julia v0.6.3 and lower I would write an outer constructor methd that would convert a Dict to my custom type, which I’ve written about before.
This would look something like this:
struct Foo
a::Int
b::Int
end
function Foo(x::Dict)
field_names = String.(fieldnames(Foo))
Foo((get.(x, field_names, nothing))...)
end
I do this because I often work with JSON APIs but also want to take advantage of Julia’s type system once I have the data.
Unfortunately in Julia v1.0 broadcasting over dictionaries is reserved. So instead of broadcasting get
you have to use a for loop:
function Foo(d::Dict)
x = []
for f in fieldnames(Foo)
append!(x, get(d, String(f), nothing))
end
Foo(x...)
end
There is another approach which is to just ask for the Dict’s values:
function Foo(d::Dict)
Foo(values(x)...)
end
This works fine so long as there aren’t any extraneous keys. However I prefer to write my outer constructors using a for loop because I, usually, can’t assume that APIs won’t add keys to the payload.