算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

ことりんの等価、レンジ、タプル

今回はKotlinのちょっと細かいところについて。

※英語、または技術的な知識が至らず、内容に誤りが含まれるおそれがありますので、ご了承ください
※本エントリの8割は参考サイトの翻訳です。残りの2割は私の解釈で加筆や変更を施した構成です。

等価

参考サイト http://confluence.jetbrains.net/display/Kotlin/Basic+operations

Kotlinでは、等価(Equality)に2つの種類があります。

  • 参照の等価性(2つの参照が同一のオブジェクトを指しているか)
  • 構造の等価性(equals()関数によってチェックする)
参照の等価性

Kotlinには参照の等価性をチェックするための組み込み演算子は存在しません。代わりに、identityEquals()というインライン関数があります(インライン関数については1月9日の記事を参照)。次のコードを見てください*1

a.identityEquals(b)
// or
a identityEquals b // infix call

構造の等価性

構造の等価性のチェックには == を、非等価には != を使用します。nullとの比較のときに注意してください。 a == null と記述されたコードは自動的に a.identityEquals(null) に変換されます。つまり、どちらの記述をしても同じです。

レンジ

レンジは rangeTo()関数(..演算子に対応)により形成されます。

if(n in 1..10) {
  println("1以上10以下の数です")
}
var sum = 0
for(n in 1..10) {
  sum += n
}
println(sum) //1から10までの和

rangeTo()関数が返す型の共通の規則

  • Intのように列挙可能な型では、raengeTo()は IterableRangeオブジェクトを返します。IterableRangeはcontains()関数(in演算子に対応)による範囲チェックと、iterator()関数による反復処理をサポートしています。
  • その他の型(StringやDoubleなど)では、contains()のみサポートするRangeオブジェクトを返します。

タプル

参考サイト http://confluence.jetbrains.net/display/Kotlin/Tuples

関数から複数の値を返したい場合など、一緒にデータを扱う軽量なメカニズムをタプルは提供します。

タプルの型とリテラル

Tuple0からTuple21まで、22個のタプルクラスがあります。Tuple0(Unitとも言う)は0個の型パラメータを持ち、Tupl1は1個のパラメータを持ち、以降も同様。型パラメータはタプルコンポーネントの型を決定します。例えばTuple2は次のように定義されています*2

class Tuple2(
val _1 : T1,
val _2 : T2
)

タプルの型と値は短く書くと次のようになります*3

val intStrPair : #(Int, String) = #(1, "") // same as 'Tuple2(1, "")'

*1:http://confluence.jetbrains.net/display/Kotlin/Basic+operationsより引用

*2:http://confluence.jetbrains.net/display/Kotlin/Tuplesより引用

*3:http://confluence.jetbrains.net/display/Kotlin/Tuplesより引用