logankilpatrick
logankilpatrick

Reputation: 14551

Can you create a singleton in Julia?

I know that Julia does not have OOP but that multiple dispatch enables similar ideas. Given how seemingly contentious the use of singletons are in Python, I am wondering if there is a similar idea Julia (i.e. a struct that can only be instantiated once).

I am wondering if there's a way to have the constructor keep track of the number of times an object was instantiated with a global var or something like that? Or it's altogether not be possible?

Upvotes: 4

Views: 1062

Answers (2)

Joaquín
Joaquín

Reputation: 495

From this book, a singleton can be defined as a type without fields:

struct MySingleton end

julia> MySingleton() === MySingleton()
true

You can also use Val, which can receive any value (of bit type):

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

julia> Val(:foo) === Val(:foo)
true

using Val you can write something like this:

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 

The definition of Val is:

struct Val{x} end

So, for a more clear readability of your code, you could define your own singleton type as, for example:

struct Command{x} end

Upvotes: 5

Oscar Smith
Oscar Smith

Reputation: 6398

The main way people make singletons in Julia is to define an empty struct (which means that it has 0 size), and define methods that return information for it.

struct Singleton
end
data(::Singleton) = "whatever you want it to do"

etc.

Upvotes: 8

Related Questions