immutable structについて


投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/12/4 0:43
SHOO  管理人   投稿数: 658
immutable structの使い方についての議論です。

immutable structはとても使いにくいものだと思うのですが、その理由は、代入できない事につきます。
immutableなのだから当たり前なのですが、これに起因して問題が生じます。
immutable structをメンバとして持った、普通の構造体までも、代入不可能になる点です。

#code(d){{{
immutable struct ID
{
int value;
}

struct Data
{
ID id; // これが代入不可能になる。
}

void main()
{
Data data = Data(ID(1));
data.id = ID(2); // error
data = Data(ID(3)); // error
}
}}}

この2つのエラーはそれぞれ意味が異なっていると私は考えます。
1つ目のエラーは当然といえば当然なのですが、Data構造体だけ見た場合に変数idがimmutable変数だということが分かりにくいのが問題です。変数idは実際にはimmutableであるため、そのように定義できてしまうのは良くないのではないでしょうか。
2つ目のエラーはより分かりにくいエラーです。変数idがimmutableであるため、Dataを代入することでimmutable変数の不変性を破壊してしまう問題があります。したがって、エラーが出るのは正しいのですが、これは、Dataが代入不可能であり、多くのアルゴリズムやコンテナの要素として使うことができないことを意味します。

これらの問題を考えると、immutable structは非常に使いにくくなってしまいます。
みなさんはimmutable structを利用したことがあるでしょうか?
使うとしたら、どのような場面でしょうか?
ほんとうに必要なのでしょうか?

皆様の忌憚ない意見をお聞かせください。
投票数:30 平均点:6.33
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/12/4 2:48 | 最終変更
haru-s  新米   投稿数: 17
#code{{
struct ID
{
immutable int value;
}

struct Data
{
ID id;
}

immutable struct ID2
{
int value;
}

struct Data2
{
ID2 id;
}

void main()
{
Data data = Data(ID(1));
Data2 data2 = Data2(ID2(1));

data.id = ID(2);//a.d(26): Error: can only initialize const member id inside constructor
data2.id = ID2(2);//a.d(27): Error: can only initialize const member id inside constructor

data = Data(ID(3));
data2 = Data2(ID2(3));//a.d(30): Error: variable a.main.data2 cannot modify struct with immutable members
}
}}

L26とL29の挙動は違うんですね.
immutable structって,メンバがすべてimmutableになるだけだと思っていました.

1つ目について.
immutable struct ID2はID2そのものがimmutableになり,メンバをすべてimmutableにするのとは違うのならば,
Data2ではimmutable(ID2) id;と書かないといけない方がいいんじゃないかと思います.
scope classのインスタンスはscope instance = new Hoge;とscopeを明記しなければならないのと同じですよね.

2つ目について.
idはimmutable(ID2) id;で定義されたものと等価だしそりゃあこうなりますよね.
immutable(ID2)* id;と自分で定義するならまだ使い道もあるかもしれないけど・・・.
投票数:21 平均点:6.19
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/12/6 19:18
SHOO  管理人   投稿数: 658
おそらくそれはコンパイラのバグじゃないでしょうか。

#code(d){{{
import std.stdio;
struct ID
{
immutable int value;
}

struct Data
{
ID id;
}
void main()
{
Data data = Data(ID(1));
immutable int* val = &data.id.value;
writeln(*val);
data = Data(ID(3));
writeln(*val);
}
}}}

これって、できるべきじゃありませんよね。
投票数:23 平均点:4.78
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2010/12/7 2:07
SHOO  管理人   投稿数: 658
http://d.puremagic.com/issues/show_bug.cgi?id=5327
とりあえずBugzillaに投稿しておきました。
投票数:28 平均点:3.21
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu