とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

mutable, const, immutableでいろいろ実験

実験コードぺたぺた

import std.stdio;

auto mutableFunc(int m){return m;}
auto constFunc(const int c){return c;}
auto immutableFunc(immutable int i){return i;}

unittest
{
 int m;
 writeln(typeof(m).stringof);
 writeln(typeof(mutableFunc(m)).stringof);
 writeln(typeof(constFunc(m)).stringof);
 writeln(typeof(immutableFunc(m)).stringof);
 writeln();
 
 const int c;
 writeln(typeof(c).stringof);
 writeln(typeof(mutableFunc(c)).stringof);
 writeln(typeof(constFunc(c)).stringof);
 writeln(typeof(immutableFunc(c)).stringof);
 writeln();
 
 immutable int i;
 writeln(typeof(i).stringof);
 writeln(typeof(mutableFunc(i)).stringof);
 writeln(typeof(constFunc(i)).stringof);
 writeln(typeof(immutableFunc(i)).stringof);
 writeln();
}

class C{}
auto mutableFunc(C m){return m;}
auto constFunc(const C c){return c;}
auto immutableFunc(immutable C i){return i;}

unittest
{
 C m = new C;
 writeln(typeof(m).stringof);
 writeln(typeof(mutableFunc(m)).stringof);
 writeln(typeof(constFunc(m)).stringof);
 // writeln(typeof(immutableFunc(m)).stringof);
 writeln();
 
 const C c = new const(C);
 writeln(typeof(c).stringof);
 // writeln(typeof(mutableFunc(c)).stringof);
 writeln(typeof(constFunc(c)).stringof);
 // writeln(typeof(immutableFunc(c)).stringof);
 writeln();

 immutable C i = new immutable(C);
 writeln(typeof(i).stringof);
 // writeln(typeof(mutableFunc(i)).stringof);
 writeln(typeof(constFunc(i)).stringof);
 writeln(typeof(immutableFunc(i)).stringof);
 writeln();
}

void main(){}

実行結果:

int
int
const(int)
immutable(int)

const(int)
int
const(int)
immutable(int)

immutable(int)
int
const(int)
immutable(int)

C
C
const(C)

const(C)
const(C)

immutable(C)
const(C)
immutable(C)

感想:

値型の int

コピーされるのでmutable, const, immutable関係なく渡せる。
返却値の型が const, immutable 修飾されているのは面白い。

参照型の class C
  • mutable -> immutable は NG.
  • const -> mutable は NG.
  • const -> immutable は NG.
  • immutable -> mutable は NG.
  • mutable は mutable のみ受け取れる。
  • const は 何でも受け取れる。
  • immutable は immutable のみ受け取れる。

実に明快。