Here's my bizarre find of the day.  Most functions can be overwritten 
without problems:

function add7(i)
    7 + i
end
Out[1]:
add7 (generic function with 1 method)
In [2]:

add7(0)
add7(0)
Out[2]:
7
In [3]:

function add7(i)
    9 + i
end
function add7(i)
    9 + i
end
Out[3]:
add7 (generic function with 1 method)
WARNING: Method definition add7(Any) in module Main at In[1]:2 overwritten 
at In[3]:2.
In [4]:

add7(0)
Out[4]:
9

However, others can not:

using DataFrames
df = DataFrame(A=[1,2,3], B=["A", "B", "C"])
println(df)
3×2 DataFrames.DataFrame
│ Row │ A │ B   │
├─────┼───┼─────┤
│ 1   │ 1 │ "A" │
│ 2   │ 2 │ "B" │
│ 3   │ 3 │ "C" │
In [3]:

row[:A] > 2
function filter(row)
    if row[:A] > 2
        return 1
    else
        return 3
    end
end  
Out[3]:
filter (generic function with 1 method)
In [4]:

[filter(row) for row in eachrow(df)]
[filter(row) for row in eachrow(df)]
Out[4]:
3-element Array{Int64,1}:
 3
 3
 1
In [5]:

rand() > 0.5
function filter(row)
    if row[:A] > 2
        return 2
    else
        return 4
    end
end  
WARNING: Method definition filter(Any) in module Main at In[3]:2 
overwritten at In[5]:2
Out[5]:
filter (generic function with 1 method)
.
In [6]:

[filter(row) for row in eachrow(df)]
Out[6]:
3-element Array{Int64,1}:
 3
 3
 1

What is it about this second example that prevents the newer method from 
being used?

Reply via email to