【问题标题】:Julia: Overriding function of abstract type not getting calledJulia:抽象类型的覆盖函数没有被调用
【发布时间】:2019-04-01 03:30:39
【问题描述】:

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

Provider 包中的 generic.jl 文件定义了一个抽象类型 AbstractDataLoader 和一个函数 load_data。该函数在 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 函数”。在这种情况下,如何确保调用覆盖的具体类型函数?

【问题讨论】:

    标签: julia


    【解决方案1】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多