せっかくstd.datetimeが入ったので置き換えました。
その中にimmutableなclass内にSysTimeが入るケースがありまして、ここでエラーが出ました。
1 | import std.datetime; |
---|---|
2 | |
3 | immutable |
4 | class Homuhomu |
5 | { |
6 | SysTime time; |
7 | |
8 | this(SysTime t) |
9 | { |
10 | time = t; |
11 | } |
12 | } |
test.d(10): Error: function std.datetime.SysTime.opAssign (ref const const(SysTime) rhs) is not callable using argument types (SysTime) immutable test.d(8): Error: constructor test.Homuhomu.this missing initializer for final field time
コンストラクタではなくopAssignが呼ばれてしまい、エラーになるようです。
C++のように初期化リストが有ったか?と思ったけど、これは無かった。
1 | this(SysTime t) : time(t) // この書き方は無い |
---|
仕様として合ってるかは不明ですが、一応次の様に書くとコンストラクタが呼ばれるような気がします。
(コピーコンストラクタは無いのでstdTimeを介して渡す)
1 | this(SysTime t) |
---|---|
2 | { |
3 | time(t.stdTime); |
4 | } |
でも、コンストラクタを呼べと怒られてしまいます。実際は呼べてないのかもしれません。
test.d(8): Error: constructor test.Homuhomu.this missing initializer for final field time
困り果てた僕は救いを求めてD言語スレに書き込みました。
(#゚Д゚) < immutableがクサッテル!!
すると心優しい住人が答えてくれました。
(゜Д゜)< immutableなんか使う奴は池沼
おかげで僕のガラスハートはブロークンですが、
なんやかんやで回避方法を思いつきました。
1 | import std.datetime; |
---|---|
2 | |
3 | //immutable |
4 | class Homuhomu_ |
5 | { |
6 | SysTime time; |
7 | |
8 | this(SysTime t) |
9 | { |
10 | time = t; |
11 | } |
12 | } |
13 | alias immutable(Homuhomu_) Homuhomu; |
これで試した範囲では正常に動いています。
1 | auto homuhomu = new Homuhomu(Clock.currTime()); |
---|
回避は出来たけどそもそもどこが悪いのかよくわからない。