...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

opIn_rのオーバーロードとローカル変数の隠蔽禁止

残りの変更について.

D 0.161
Jun 19, 2006
New/Changed Features

  • Added opIn_r operator overload.
  • Function return types for lambda delegates can now be inferred.
  • delegate keyword now optional for lambda delegates.
  • Shadowing local variable declarations is now deprecated.
  • New function template syntax.

外のスコープで宣言したローカル変数と同名のローカル変数を,内のスコープで宣言することが非推奨になった.
ただし,グローバル変数と同名のローカル変数は今まで通り宣言可能だ.
C言語の試験では,スコープの理解度を調べるために「異なるスコープにある同名の変数の問題」がよく出題される.
問題になるんだから,ややこしいってことだ.
そういうのは,そもそもできないようにしようってことだな.

連想配列では, in 式によって値が配列の要素かどうかを調べることができる.
in 式全体は,値が配列の要素であれば要素へのポインタとなり,要素でなければ null になる.
in 式をオーバーロードできるようになったので,連想配列を意味なく wrap するクラス Map を書いてみた.
戻り値や引数の型がよくわからなかったけどなんとかコンパイルできた.


import std.cstream;

class Map
{
private:
char[] map[char[]];
public:
void add(char[] key, char[] value)
{
map[key] = value;
}
// opIn_r のオーバーロード
char[]* opIn_r(char[] s)
{
return (s in map);
}
}

int a; // グローバル変数を定義しておいて…(1)

void main()
{
int a; // (1) のグローバル変数の隠蔽はOKだけど…(2)
{
// int a; // (2) のローカル変数の隠蔽は非推奨になった
}

Map map = new Map();
map.add("hello", "world");
if ("hello" in map)
{
dout.writefln(*("hello" in map));
}
}