2つのクラスと、どちらかのクラスを同じ方法で変更するプロシージャがあるとします。パラメータを(各クラスの関数を書き換えたりオーバーロードしたりする代わりに)いずれかのクラスにできるように指定するにはどうすればよいですか?簡単な例:
type
Class1[T] = object
x: T
Class2[T] = object
x: T
y: T
# this works fine
proc echoX[T](c: Class1[T]|Class2[T]) =
echo c.x
# this does not work
proc addToX[T](c: var Class1[T]|Class2[T], val: T) =
c.x += val
var c1: Class1[int]
var c2: Class2[int]
# this works fine
echoX(c1)
echoX(c2)
# this does not work
addToX(c1, 10)
addToX(c2, 100)
次のエラーが発生します。
Error: for a 'var' type a variable needs to be passed
クラスごとに個別の手順を使用すると、問題なく動作します。
proc addToX[T](c: var Class1[T], val: T) =
c.x += val
proc addToX[T](c: var Class2[T], val: T) =
c.x += val
これは、関数を簡単に書き直すことができる単純な例です。しかし、私はより複雑なクラスとプロシージャのためにこれを行うことを探しています。継承が適切な場合もありますが、基本クラスの代わりにNimクラスを変数としてプロシージャに渡すことができないようです。
角かっこはこの問題を修正します。そうでない場合は、以下var
に適用されClass1[T]
ます。
proc addToX[T](c: var (Class1[T]|Class2[T]), val: T) =
後でこれで別のコンパイラのバグに遭遇する可能性があります:https://github.com/nim-lang/Nim/issues/1385
おそらくあなたのユースケースでは、オブジェクトのバリアントまたは継承とメソッドの方がうまくいくでしょう。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加