我定义时用的抽象类型,现在删不了了

我定义时用的抽象类型,现在删不了了

julia> d = Dict{Real, String}(13=>"13", 1.3=>"1.3")
Dict{Real,String} with 2 entries:
  13  => "13"
  1.3 => "1.3"

julia> delete!(d, 13)
ERROR: MethodError: no method matching delete!(::Dict{Real,String}, ::Int64)
You may have intended to import Base.delete!

呃,我用了Base.delete!然后可以了。。。没明白。 :disappointed:


???
我怀疑你using 某个module,并且这个module里也有一个delete! 函数,函数声明和Base.delete!一样,把原来的覆盖掉了

1 个赞

正解!我用了DataStructrures.jl 不过,不是多分派么?我怕是对多分派有啥误解?要是这个Module把delete!定义得和Base里的一模一样的话,感觉也是迷惑行为。

不是,是你导入的函数和Base里的函数,两个函数的函数声明都一样,所以覆盖掉了

function foo(x::Int)
1
end

function foo(x::Int)
2
end

再repl里打出来只有最后一个foo是有效的,他覆盖掉了上一个函数

1 个赞

和Base里定义的一模一样,功能若不更强大,岂不是。。。

PS. 请用具体一点的题目(比如你的问题描述第一句话)

重载的时候需要显示声明函数所在的module(或者使用import)否则将会创建一个新的generic function,尽管名字一样但是他们所在的module不一样。

大部分package都会直接进行重载,但是有些package出于语义上的细微不同,选择了不重载而定义一个完全一样的函数以防止发生type piracy等问题。

1 个赞