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