##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/