В Юлии: поля инициализировать ни с чем

У меня есть mutable struct с необязательными полями, такими как это:

mutable struct MyStruct
    field1::Union{Int, Nothing}
    field2::Union{String, Nothing}
    field3::Union{Int, Nothing}
    field4::Union{String, Nothing}
    # ...
end

Теперь я могу написать конструктор по умолчанию, который инициализирует поля nothing:

MyStruct() = MyStruct(nothing, nothing, nothing, nothing)

Это не так приятно, когда в моей структуре много полей. Кроме того, я должен посчитать поля, чтобы получить вызов конструктора со всеми "ничтожествами" в этом случае. Есть ли лучший способ сделать это?

В зависимости от содержимого поля, я хочу позже вызвать различные функции:

if mystruct.field1 == nothing
  do_this()
else
  do_that()
end

1 ответ

Решение

Ты можешь использовать fieldcount функция для достижения этого. Эта функция дает вам количество полей, которое будет иметь экземпляр данного типа. Вот пример, содержащий mutable struct и внешний конструктор.

julia> mutable struct Foo
           x
           y
           z
       end

julia> Foo() = Foo(ntuple(x->nothing, fieldcount(Foo))...); # you can also fill an array and use `...`

julia> Foo()
Foo(nothing, nothing, nothing)
Другие вопросы по тегам