Julia:抽象类型的重写函数没有被调用

标签 julia

我正在 Julia 中开发一个 Provider 包,它将由多个 Consumer 包使用。下面是 Provider 包的项目结构的最小示例以及名为 Consumer_A 的示例 Consumer 包,以重现该问题:

enter image description here

Provider 包中的文件 generic.jl 定义了一个带有函数 load_data 的抽象类型 AbstractDataLoader。此函数在 Consumer_A 包中的文件 custom_implementation.jl 中定义的具体类型 CustomDataLoader 中被重写,如下所示:

generic.jl:

export DataProcessor, process_data

abstract type AbstractDataLoader end
function load_data(data_loader::AbstractDataLoader)
    error("No load_data function defined for $(typeof(data_loader))")
end

struct DataProcessor end
function process_data(data_loader::AbstractDataLoader)
    data = load_data(data_loader)
    println("do some processing after loading data: $data")
end

custom_implementation.jl:

import Provider

export CustomDataLoader, load_data

struct CustomDataLoader <: Provider.AbstractDataLoader  end
function load_data(data_loader::CustomDataLoader)
    return "sample data"
end

main.jl 文件有一个 main 函数,它实例化具体类型并调用一个 process_data 方法,理想情况下,该方法应该调用重写函数:

using Provider

export main

function main()
    data_loader = CustomDataLoader()
    data_processor = DataProcessor()
    process_data(data_loader)
end

但是,在运行 main() 时,我收到在 generic.jl load_data 函数中引发的错误“没有为 CustomDataLoader 定义 load_data 函数”。在这种情况下,如何确保调用重写的具体类型函数?

最佳答案

在 custom_implementation.jl 中,我尝试将 function load_data 替换为 function Provider.load_data 因为我使用的是语句 import Provider 而不是 using Provider 因为我想覆盖定义。通过此更改,它可以正常工作并且覆盖函数被调用!

更新后的custom_implementation.jl现在是:

import Provider

export CustomDataLoader, load_data

struct CustomDataLoader <: Provider.AbstractDataLoader  end
function Provider.load_data(data_loader::CustomDataLoader)
    return "sample data"
end

关于Julia:抽象类型的重写函数没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443399/

相关文章:

Julia 相当于 Matlab 的暂停?

julia - 在 Julia 中使用 Arrow.jl 进行数据压缩

if-statement - 没有 `else` 的 Julia 三元运算符

python - Julia 的运行速度比 python 慢一个数量级

json - 当我从 txt 中读取时,Dict 的键没有得到认可 - Julia

julia - 何时插入基准表达式

dataframe - 初始化缺失值的列并稍后填充字段

fortran - 从 Julia 调用 Fortran 子例程。数组有效,但整数无效

sockets - 运行脚本时,Julia 套接字 TCP 连接被拒绝,而不是 REPL

julia - 使用广播 Julia 将向量的向量转换为矩阵