julia - 有没有办法将依赖字段传递给 Julia 结构?

标签 julia

##define the struct
struct DataLoader
    getter::String
    DataLoader(getter="remote") = new(getter)
end
##testing the struct
ld = DataLoader("local")
ld.getter 

##local

ld = DataLoader()
ld.getter 

##remote

我正在尝试用 Julia 编写一个数据加载器,稍后在其上定义一些额外的方法。

用户可以通过两种方式加载数据——“远程”和“本地”。

如果用户选择local,我需要另一个字段base_dir - 存储数据的目录。如果用户选择 remote,我不需要 base_dir,因为我知道向哪个 URL 发出请求。

之后,当加载器被定义后,我将调用加载器上的一些函数来做其他事情(下面的示例函数):

function bar(x::DataLoader)
    if x.getter == "local"
        #do_somethings
        println("local found")

    elseif x.getter == "remote"
        println("remote found")

    else
        println("wrong mode passed")
        
    end  
end

我的问题是我如何在结构中定义这种相互依赖?也就是说,我如何告诉用户并在我的代码中实现如果getter 是 local 我需要 base_dir 如果它是远程的,我可以从我的结构中动态删除字段 base_dir

我是 Julia 的新手,所以任何其他关于改进代码的提示也非常受欢迎。

最佳答案

我认为有几种方法可以做到这一点;在我看来,最简单的就是依靠调度员。这围绕着使用两个结构,一个用于“本地”,一个用于“远程”。如果确实需要,您可以创建一个它们都属于的“AbstractLoader”,最后会详细介绍。

struct LocalLoader 
    basedir::String
end

struct RemoteLoader 
end

ll = LocalLoader("test_directory")
rl = RemoteLoader()

function bar(ll::LocalLoader)
    println("Base directory is $(ll.basedir)")
end

function bar(rl::RemoteLoader)
    println("This is the remote loader")
end

bar(ll)
bar(rl)

我看到了这个逻辑的几个优点:

  • 对于开发者:两种方法可以独立开发
  • 对于开发人员:您不必在代码中放置一些“if”逻辑,这样会更简单。 (并且不可能通过无效模式)。换句话说:您不必实现调度程序,因为您依赖 Julia 的调度程序。
  • 它向用户阐明了 API:当用户需要本地对象时,必须传递一个字符串。当用户想要一个 Remote 时,他/她不能传递额外的参数。

主要缺点是代码重复。如果存在某些代码重复,则可以解决,为此您需要使这两个结构属于一个抽象类型。

这将按以下方式更改代码:

abstract type  AbstractLoader end

struct LocalLoader <: AbstractLoader
    basedir::String
end

struct RemoteLoader <: AbstractLoader
end

ll = LocalLoader("test_directory")
rl = RemoteLoader()

function bar(ll::LocalLoader)
    println("Base directory is $(ll.basedir)")
end

function bar(rl::RemoteLoader)
    println("This is the remote loader")
end

bar(ll)
bar(rl)

function foo(al::AbstractLoader)
    println("Do common tasks")
end

foo(ll)
foo(rl)

关于julia - 有没有办法将依赖字段传递给 Julia 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67881953/

相关文章:

csv - 有没有办法在 writetable() 中使用字符串作为分隔符 - Julia

xml - LightXML.jl : Insert doctype

numpy - allclose - 如何在 Julia 中检查两个数组是否接近

julia - Julia 中如何锁定变量类型?

julia - 如何在 Julia 中创建滞后变量?

julia - julia 中的 "where T"在 T 之后没有任何规范的情况下做什么?

arrays - 在 Julia 中初始化数组

types - 在 Julia 中使用 @code_warntype

julia - 如何将自定义数据类型转换为数组的数组

dataframe - 如何处理 Julia 中 bool 上下文中的缺失?