Hi,
I stumbled upon an issue in my code and I can't quite figure out the
behavior. Any hints would be much appreciated, thanks in advance.
So, I have a function:
function df_to_m(df::DataFrames.DataFrame, m::Jinnie_Model)
It iterates over each row of the df DataFrame and instantiates the
corresponding m model type, returning an array of m model instances.
For example, say if I have this DataFrame (*df*)
1x3 DataFrames.DataFrame
| Row | name | url | updated_at
|
|-----|---------|---------------------------------------|------------------------------|
| 1 | "Bokeh" | "git://github.com/bokeh/Bokeh.jl.git" | "2016-02-10
19:21:57.209996" |
I would call
df_to_m(df, Jinnie.Package())
and expect to get
1-element Array{Any,1}:
Jinnie.Package("packages","name","Bokeh","git://github.com/bokeh/Bokeh.jl.git")
where Jinnie_Model is an abstract type defined in the Jinnie module as
abstract Jinnie_Model
and Jinnie.Package extends Jinnie_Model
type Package <: Jinnie_Model
_table_name::AbstractString
_id::AbstractString
name::AbstractString
url::AbstractString
Package(; name = "", url = "") = new("packages", "name", name, url)
end
However, the problem is that df_to_m does not want to accept subtypes of
Jinnie_Model:
ERROR: MethodError: `df_to_m` has no method matching
df_to_m(::DataFrames.DataFrame, ::Jinnie.Package)
Closest candidates are:
df_to_m(::DataFrames.DataFrame, ::Jinnie.Jinnie_Model)
If I drop the type constraint in the function's definition, it works great,
as expected:
function df_to_m(df::DataFrames.DataFrame, m) # this version works
==================================
My questions are:
1. how can I get the function to accept subtypes of Jinnie_Model while
keeping the type constraint?
2. I don't like passing instances like Jinnie.Package() and I would rather
pass the type itself Jinnie.Package into the polymorphic function. It's a
crappy code smell so I must be doing something wrong.
I experimented with defining the function as
function df_to_m(df::DataFrames.DataFrame, m::Type{Jinnie.Jinnie_Model})
but got the same error, polymorphism be damned.
ERROR: MethodError: `df_to_m` has no method matching
df_to_m(::DataFrames.DataFrame, ::Type{Jinnie.Package})
Closest candidates are:
df_to_m(::DataFrames.DataFrame, ::Type{Jinnie.Jinnie_Model})
How could the function be defined to work with the types itself (rather
than instances) and be polymorphic as intended?
Thanks for your time.
Cheers