• SysTimeとimmutable

    2011年06月29日 23時16分
    日付型は自作のclassを使っていたのですが、
    せっかくstd.datetimeが入ったので置き換えました。

    その中にimmutableなclass内にSysTimeが入るケースがありまして、ここでエラーが出ました。
    1import std.datetime;
    2
    3immutable
    4class 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++のように初期化リストが有ったか?と思ったけど、これは無かった。
    1this(SysTime t) : time(t) // この書き方は無い



    仕様として合ってるかは不明ですが、一応次の様に書くとコンストラクタが呼ばれるような気がします。
    (コピーコンストラクタは無いのでstdTimeを介して渡す)
    1this(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なんか使う奴は池沼



    おかげで僕のガラスハートはブロークンですが、
    なんやかんやで回避方法を思いつきました。

    1import std.datetime;
    2
    3//immutable
    4class Homuhomu_
    5{
    6    SysTime time;
    7
    8    this(SysTime t)
    9    {
    10        time = t;
    11    }
    12}
    13alias immutable(Homuhomu_) Homuhomu;


    これで試した範囲では正常に動いています。
    1auto homuhomu = new Homuhomu(Clock.currTime());


    回避は出来たけどそもそもどこが悪いのかよくわからない。

    コメントを書く

    名前
    本文
    編集用パスワード 入力すると編集が行えます
    管理者のみ閲覧