JuliaでStructを削除する


8

複合タイプを作成しました

mutable struct Person
    id::Int64
end

これはうまくいったので、このようにタイプを拡大したい

mutable struct Person
    id::Int64
    contacts::Array{Int64}
end

しかし、これはであると言われていinvalid redefinition of constant Personます。

タイプを削除するにはどうすればよいですか?REPLを再起動する以外の方法はありますか?(良いと言って。)


使ってみましたReviseか?
オスカースミス

Reviseは構造体の再定義を処理しません。timholy.github.io/ Revise.jl / stable / limitationsを参照してください。
fredrikekre

回答:


17

これは、残念ながらいくつかの一つである限界Revise.jl(とそれを行うための方法があった場合、それはおそらくで実施されますRevise)。したがって、Revise現在でも、タイプの定義を変更するには、juliaを再起動する必要があります。

これが現在不可能である理由を説明しよう。

julia> struct Person
           name :: String
       end

julia> alice = Person("Alice")
Person("Alice")

# Imagine you have some magic trick that makes this possible:
julia> struct Person
           id   :: Int
           name :: String
       end

julia> bob = Person(42, "Bob")
Person(42, "Bob")

# What should be the type of alice now?
julia> alice
Person("Alice") # Not consistent with the current definition of Person




新しいタイプの開発段階で、次のトリックを使用することがあります。ただし、これは多少ハックのようなものであり、アドバイスする必要があるかどうかはわかりません。自己責任で使用してください。

アイデアは、実際のタイプ定義に番号を付け、のようPerson1にタイプに名前を付けPerson2、定義が変更されるたびにインクリメントされるバージョン番号で構成されます。メソッド定義でコード全体に散らばるこれらの番号付きタイプ名を使用するために、最新の定義を一時的に共通の番号なし名前にエイリアスできます。

たとえばPerson、名前のみを使用して、タイプの最初の実装があるとします。

# First version of the type
julia> struct Person1
           name :: String
       end

# Aliased to just "Person"
julia> Person = Person1
Person1

# Define methods and instances like usual, using the "Person" alias
julia> hello(p::Person) = println("Hello $(p.name)")
hello (generic function with 1 method)

julia> alice = Person("Alice")
Person1("Alice")

julia> hello(alice)
Hello Alice

次に、Person型の定義を変更してidフィールドを追加するとします。

# Second version of the type: increment the number
# This is strictly a new, different type
julia> struct Person2
           id   :: Int
           name :: String
       end

# But you can alias "Person" to this new type
julia> Person = Person2
Person2

# It looks as though you update the definition of the same "hello" method...
julia> hello(p::Person) = println("Hello $(p.name), you have id: $(p.id)")
hello (generic function with 2 methods)

# ...when in reality you are defining a new method
julia> methods(hello)
# 2 methods for generic function "hello":
[1] hello(p::Person2) in Main at REPL[8]:1
[2] hello(p::Person1) in Main at REPL[3]:1

julia> bob = Person(42, "Bob")
Person2(42, "Bob")

julia> hello(bob)
Hello Bob, you have id: 42

# alice is still of type "Person1", and old methods still work
julia> hello(alice)
Hello Alice

2
私はあなたの答えが本当に好きです。それは質問に答え、背景を説明し、本当に良い回避策を提供します。どうもありがとう。
ジョージリー

5

いいえ、これはJuliaを再起動しないと不可能です。


申し訳ありませんが、この文章は何を伝えているのですか?
ジョージリー

2
「ジュリアを再起動しないとこれは不可能だ」と私は思う。
DNF

申し訳ありませんが、私の編集を台無しにしました。修正、ありがとう。
fredrikekre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.