プログラミング言語 開発スレ( ´�D`)
■ このスレッドは過去ログ倉庫に格納されています
0595デフォルトの名無しさん
NGNG型情報が失われてしまうのは痛い
↓こういうのがいいなぁ
valVariable: int = 10;
refVariable: int* = valVariable; //refVariableは参照型
すべてのstruct/enumなんかの値型は後ろに*をつけることで
参照型にすることが出来ます
上の例はint型をint*型にBoxingしています。
イメージは↓のように
IBoxed: interface[ T: struct ]
{
Value: property get{} set{};
}
BoxingClass : class[ T: struct ] ( T, IBoxed[ T ] ){}
int* : alias BoxingClass[ int ];
valVariable: int = 10;
refVariable: int* = new int*( valVariable ); //refVariableは参照型
int*はintとほとんど同じように扱うことが出来ますが、
代入やパラメータに渡すときに参照型の特徴が出てきます
比較はC#のstring同様値比較だと何かと幸せです(が問題もあります)。
代入が参照先の変更になるので、元の値を変更するためのValueプロパティを持ちます。
int*はintへの暗黙の変換を許します(Unboxing)
(型情報は失われていないので安全です)
以下例
val1: int = 100;
ref1: int* = val1;
ref2: int* = ref1;
ref3: int* = ref2;
ref2 = 200; //ref2の参照先を別のint*オブジェクトにします。val1/ref1/ref3には影響ありません
ref3.Value = 300; // ref3の参照先の値を300にします。ref1も300になります。val1には影響しません
Unboxingの際に参照先がnullの場合は例外が出されます
問題は、Boxing/Unboxingがあまりにシームレスに行われてしまうので、
Unboxingの際のnullアクセスのミスを犯しやすくなるかもしれません。
Boxing演算子&とUnboxing演算子*を導入して
ref4: int* = &val;
val2: int = *ref4;
//(C++に似てますがやってることはちょっと違う)
などとすると注意も促せるかと
(ただし、値型と参照型を同じように扱えなくなるのでtemplateは作りにくくなるかもし得れません)
■ このスレッドは過去ログ倉庫に格納されています