Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Julia中定义抽象类型的默认方法

在Julia中定义抽象类型的默认方法
EN

Stack Overflow用户
提问于 2021-10-30 12:07:09
回答 1查看 64关注 0票数 5

在Julia中,如何在单独的模块中提供方法的默认实现?例如,如果抽象类型位于相同的模块中,我就没有问题,这就像我期望的那样工作:

代码语言:javascript
运行
AI代码解释
复制
abstract type Foo end

howdy(x::Foo)::Union{String, Nothing} = nothing

struct Bar <: Foo end

function howdy(x::Bar)::Union{String, Nothing}
    "I'm a Bar!"
end

struct Baz <: Foo end

if abspath(PROGRAM_FILE) == @__FILE__
    bar = Bar()
    s = howdy(bar)
    if isa(s, String)
        println(s)
    end
    baz = Baz()
    t = howdy(baz)
    if isa(t, String)
        println(t)
    end
end

然而,一旦我把抽象类型放入它自己的模块中,它就不再起作用了:

src/qux.jl中,我放了:

代码语言:javascript
运行
AI代码解释
复制
module qux

abstract type Foo end

howdy(x::Foo)::Union{String, Nothing} = nothing

export Foo, howdy
end # module

然后在reproduce.jl中我添加了:

代码语言:javascript
运行
AI代码解释
复制
using qux

struct Bar <: Foo end

function howdy(x::Bar)::Union{String, Nothing}
    "I'm a Bar!"
end

struct Baz <: Foo end

if abspath(PROGRAM_FILE) == @__FILE__
    bar = Bar()
    s = howdy(bar)
    if isa(s, String)
        println(s)
    end
    baz = Baz()
    t = howdy(baz)
    if isa(t, String)
        println(t)
    end
end

然后我得到:

代码语言:javascript
运行
AI代码解释
复制
julia --project=. reproduce.jl
I'm a Bar!
ERROR: LoadError: MethodError: no method matching howdy(::Baz)
Closest candidates are:
  howdy(::Bar) at ~/qux/reproduce.jl:5
Stacktrace:
 [1] top-level scope
   @ ~/qux/reproduce.jl:18
in expression starting at ~/qux/reproduce.jl:11
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 12:52:16

你的问题在Julia手册中有here解释。

问题是在您的代码中,正如您在这里看到的:

代码语言:javascript
运行
AI代码解释
复制
julia> module qux

       abstract type Foo end

       howdy(x::Foo)::Union{String, Nothing} = nothing

       export Foo, howdy
       end # module
Main.qux

julia> using .qux

julia> struct Bar <: Foo end

julia> function howdy(x::Bar)::Union{String, Nothing}
           "I'm a Bar!"
       end
howdy (generic function with 1 method)

julia> methods(howdy)
# 1 method for generic function "howdy":
[1] howdy(x::Bar) in Main at REPL[4]:1

julia> methods(qux.howdy)
# 1 method for generic function "howdy":
[1] howdy(x::Foo) in Main.qux at REPL[1]:5

您有两个不同的howdy函数,每个函数都有一个方法。一个在qux模块中定义,另一个在Main模块中定义。

您要做的是向qux模块中定义的howdy函数添加一个方法。我通常会通过使用模块名称限定导出的函数名来完成此操作,因为这是一种明确的方式来表明您想要做什么:

代码语言:javascript
运行
AI代码解释
复制
julia> module qux

       abstract type Foo end

       howdy(x::Foo)::Union{String, Nothing} = nothing

       export Foo, howdy
       end # module
Main.qux

julia> using .qux

julia> struct Bar <: Foo end

julia> function qux.howdy(x::Bar)::Union{String, Nothing}
           "I'm a Bar!"
       end

julia> methods(qux)
# 0 methods:

julia> methods(howdy)
# 2 methods for generic function "howdy":
[1] howdy(x::Bar) in Main at REPL[4]:1
[2] howdy(x::Foo) in Main.qux at REPL[1]:5

正如您现在看到的,您有一个具有两个方法的单个howdy函数,所有方法都将按您所希望的那样工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69781770

复制
相关文章

相似问题

在Julia中如何定义抽象类型的所有参数子类型的方法?

11

具有抽象类型和定义类型的Julia类型

23

Julia中的抽象参数类型

10

优化中的Julia抽象类型?

10

在Julia中抽象类型数组的使用

38
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文