4

我有一个A描述框架的模块。然后,几个B实现框架的模块(这里只是 )。最后,我想C使用任何实现。

但是,运行以下示例:

module A
    abstract type Ab end

    f(::Ab) = "Not NotImplemented"
    export Ab, f
end

module B
    using Main.A
    struct Bb <: A.Ab end
    A.f(::Bb) = "B"
    export Bb, f
end

module C
    using Main.A
    struct Cc
        btype :: A.Ab
    end
    f(model::Cc) = f(model.btype)
    function g(model::Cc)
        @show f(model)
    end
    export Cc, g
end

using Main.A, Main.B, Main.C

ex0 = B.Bb()
ex1 = C.Cc(ex0)
g(ex1)

返回错误

ERROR: LoadError: MethodError: no method matching f(::Main.B.Bb)
Closest candidates are:
  f(::Main.C.Cc) at C:\Users\tangi\.julia\dev\VariationalInequalitySolver\script.jl:2

而且我真的不想在模块 C 中导入 B 来保证通用性。

4

1 回答 1

4

问题是:

f(model::Cc) = f(model.btype)

在您的模块中,因为它在具有 name的模块C中创建了一个新函数Cf

你需要写:

A.f(model::Cc) = f(model.btype)

f它为module的 function 创建了一个新方法A

于 2021-11-10T07:41:00.140 回答