isless 函数的新调度不起作用

Jaf*_*rov 3 julia

我需要能够比较名为 的结构体的实例Hijri,因此我为该函数定义了一个新方法,isless()如下所示:

function isless(a::Hijri, b::Hijri)
    tuple_a = datetuple(a)
    tuple_b = datetuple(b)
    
    return tuple_a < tuple_b
end
Run Code Online (Sandbox Code Playgroud)

datetuple()以元组形式返回Hijri结构体的值。

这工作正常:

@show isless(a, b)
Run Code Online (Sandbox Code Playgroud)

然而,这个

@show a < b
Run Code Online (Sandbox Code Playgroud)

抛出错误:

ERROR: LoadError: MethodError: no method matching isless(::Main.HijriConverter.Hijri, ::Main.HijriConverter.Hijri)
Closest candidates are:
  isless(::Any, ::Missing) at ~/Downloads/julia-1.7.0/share/julia/base/missing.jl:88
  isless(::Missing, ::Any) at ~/Downloads/julia-1.7.0/share/julia/base/missing.jl:87
Stacktrace:
 [1] <(x::Main.HijriConverter.Hijri, y::Main.HijriConverter.Hijri)
   @ Base ./operators.jl:352
 [2] top-level scope
   @ show.jl:1047
in expression starting at /home/jafar_isbarov/Documents/projects/hijri/HijriConverter.jl/src/HijriConverter.jl:1
Run Code Online (Sandbox Code Playgroud)

可能是什么原因?

Jaf*_*rov 5

我必须isless从以下位置导入Base

import Base: isless
Run Code Online (Sandbox Code Playgroud)

或在我的函数定义中使用Base.isless(而不是) 。isless

function Base.isless(...)

end
Run Code Online (Sandbox Code Playgroud)

这个问题最初是在Julia Discourse 上得到回答的。

  • 是的,您最初所做的是在全局作用域中定义一个新函数“isless”,而不是“Base”中单独的“isless”函数。要求显式模块源来扩展另一个模块的功能是很好的,因为没有人愿意记住每个模块的名称空间,只是为了避免意外改变其他模块的行为(如果你修改 Base 不当,你可能会破坏 Julia 会话)。对于后代,它记录在此处:https://docs.julialang.org/en/v1/manual/modules/#using-and-import-with-specific-identifiers,-and-adding-methods (2认同)