你能在 Julia 中创建一个单例吗?

log*_*ick 4 julia

我知道 Julia 没有 OOP,但多重分派可以实现类似的想法。鉴于 Python 中单例的使用看似有争议,我想知道 Julia 是否有类似的想法(即只能实例化一次的结构)。

我想知道是否有一种方法可以让构造函数跟踪使用全局变量或类似的东西实例化对象的次数?还是根本不可能?

Osc*_*ith 8

人们在 Julia 中创建单例的主要方式是定义一个空结构(这意味着它的大小为 0),并定义为其返回信息的方法。

struct Singleton
end
data(::Singleton) = "whatever you want it to do"
Run Code Online (Sandbox Code Playgroud)

ETC。

  • 这种模式更适合不可变的单例,在这种情况下,数据将保留在类型的函数定义中 (2认同)

Joa*_*uín 5

本书中,单例可以定义为没有字段的类型:

struct MySingleton end

julia> MySingleton() === MySingleton()
true
Run Code Online (Sandbox Code Playgroud)

您还可以使用Val,它可以接收任何值(位类型):

julia> Val(1) === Val(1)
true

julia> Val(:foo) === Val(:foo)
true
Run Code Online (Sandbox Code Playgroud)

使用Val你可以写这样的东西:

julia> do_something(::Val{:asymbol}) = println("foo")

julia> do_something(::Val{:anothersymbol}) = println("bar")

julia> do_something(s::String) = do_something(Val{Symbol(s)})

julia> do_something("asymbol")
foo 
Run Code Online (Sandbox Code Playgroud)

的定义Val是:

struct Val{x} end
Run Code Online (Sandbox Code Playgroud)

因此,为了使代码具有更清晰的可读性,您可以定义自己的单例类型,例如:

struct Command{x} end
Run Code Online (Sandbox Code Playgroud)