在Julia中检查外部构造函数时出错

时间:2018-01-23 11:03:23

标签: julia

我有以下struct和两个外部构造函数

struct SingleSpinState <: EPState
    spins::BitArray{1}
end

SingleSpinState(n_sites::Int) = SingleSpinState(rand(Bool, n_sites))
SingleSpinState(n_sites::Int, n_particles::Int) = SingleSpinState(cat(1,trues(n_particles),falses(n_sites - n_particles)))

在第二个构造函数中,我想检查n_sites&gt; n_particles。根据{{​​3}}基本错误检查应继续在内部构造函数中,但在我看来,上述情况将非常普遍:外部构造函数使用内部构造函数但其参数将以某种方式受到约束。 / p>

处理这种情况的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以定义多个内部构造函数:

julia> struct SingleSpinState
           spins::BitVector

           SingleSpinState(n_sites::Int) = new(bitrand(n_sites))

           function SingleSpinState(n_sites::Int, n_particles::Int)
               if !(n_sites > n_particles)
                   throw(ArgumentError("n_sites must be larger than n_particles"))
               end
               new([trues(n_particles); falses(n_sites-n_particles)])
           end
       end

julia> SingleSpinState(2)
SingleSpinState(Bool[false, true])

julia> SingleSpinState(2, 1)
SingleSpinState(Bool[true, false])

julia> SingleSpinState(2, 3)
ERROR: ArgumentError: n_sites must be larger than n_particles
Stacktrace:
[...]