2012年11月19日月曜日

条件演算子(三項演算子)の言語の違い

Objective-CでDictionaryの内容をクエリ文字列化するメソッドを、

NSMutableString *result = [NSMutableString string];
__block BOOL firstQuery = YES;
[param enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
 (firstQuery) ? firstQuery = NO : [result appendString:@"&"];
 [result appendFormat:@"%@=%@",key,obj];
}];

こんな風に書いた。(勿論実コードはパーセントエンコードとかちゃんとやってる)

Objective-Cは相変わらず好きになれないけど、for文なしでコレクションの走査ができるブロックの簡便さは良いね。

それで、Javaでも似たことをやろうとしたらコンパイルが通らなかった。

C言語では三項演算子 (条件式) ? 式A : 式B の、式Aと式Bはどんな内容でも評価される。もちろん左辺式が存在する場合に、式Aと式Bのいずれかが代入先の型と違うならば、コンパイルエラーになる。逆に言えば左辺式がなければ、上記みたいに返り値型がvoidのメソッド実行もできる。

対して、Javaでは式Aと式Bの型には互換性がなければならない。式Aと式Bに共通のスーパークラスが存在したり、同一のインターフェースを実装しているなど、オートボクシングによって両者が同一の型とみなせる状況でのみ使用することができる。

C#とかはもうちょっと厳しくて、キャストなしで式Aが式Bに代入できる(またはその逆)場合にしか、三項演算子を使うことができないらしい。

三項演算子がネストした際の挙動が言語ごとにかなり違う…というのは知っていたけど、こんな基本的なところに違いがあるもんなんだねえ。

参考:Java5で条件演算子(三項演算子)に仕様変更があった! - 地平線に行く

0 件のコメント:

コメントを投稿