kotlin

kotlin 基本構文 - 型,リテラル,null許容型,型変換,配列,コレクション,定数

更新日:

アウトプットによる記憶の定着の意味で超入門書をトレースして書き起こす。
超入門が終わったら中級書に着手。

変数と型宣言

変数は宣言して使う。構文がまんまDelphiみたい。
kotlinは行末セミコロン不要。
こんなところで主張しなくても良いのにと思う。

型は以下の通り。Javaみたいに全てはクラスです!とか言わない。
プリミティブはプリミティブ。

データ型 概要
Boolean 真偽
Byte 8bit整数
Short 16bit整数
Int 32bit整数
Long 64bit整数
Float 32bit浮動小数点
Double 64bit浮動小数点
Char 文字
String 文字列

静的型付けなので定義した型以外の値を代入できない。
下記はIntelliJ IDEA上でコンパイル前にエラーであることがわかる。

型推論の挙動は以下の通り。最初に代入した値の型が変数の型となり、
2回目以降の代入で異なる型を代入できない。
型推論のミスマッチはコンパイルしたときにわかる。

変数宣言時に初期値を省略することができるが、型と初期値を両方省略することはできない。
これは変数宣言時に型推論の情報を決めるという仕組みでそうなっている。

どんな値も入る魔法の型が存在する。Any型

数値リテラル

10進数、16進数、2進数、指数。普通。他の言語と同じ。

Rubyにもあったけども、桁表現ができる。
絶対使わないだろうけど、知ってたら知ってたで無用に使ってみたくなる。

型サフィックス

数値リテラルのデフォルト型はInt、浮動小数点数リテラルのデフォルト型はDouble。
リテラルに型サフィックスを付けることで、型を変更できる。
型サフィックスはLong変数のL、Float型のFのみ。
絶対使わなそうなパターンが用意されていないところの割り切りが、妥当な感じがする。

文字列リテラル

文字列リテラルはダブルクォート1つで括るタイプと、ダブルクォート3つで括るタイプの2つ。
前者はPHP,Rubyの流れではなく、あくまでJava。後者はPHPのヒアドキュメント相当。

PHPでいつも気持ちが悪い、ヒアドキュメント内のインデントの空白問題。
バー(|)を書き.trimMargin()を呼ぶことで、コード上のインデントを有効として残したまま変数内のインデントを無視できる。

変数展開はPHPと同じように$を使う。

PHPの場合、変数の後に文字列を続けても変数分を自動認識してくれたが、kotlinはしてくれない。
変数の後には空白を書くか${}で囲む必要がある。

null許容型

kotlinはデフォルトでnullを不許可。
変数宣言のときに型の末尾に"?"を付けることでnullを許容できるようにできる。

null許容型の変数をnull不許可の変数に代入することはできない。
代入される側をAny型にしたとしてもN.G.。

ぬるぽ防止構文 (Safe access operator)

Nullableな変数がnullだった場合は、その変数にアクセスするとぬるぽが起こる。
ぬるぽを徹底して排除するために、メンバにアクセスする際にセーフコール演算子を使う。
変数がnullであった場合、セーフコール演算子はnullを返し、nullでない場合に限りメンバを返す。

普通にnullable型とnullを比較することが出来るので、if文でぬるぽ回避することもできる。

左辺がnullであった場合に限り指定した右辺を返す演算子(?:)も積極的に使える。

implicitな型変換

kotlinは基本的に暗黙の型変換が効かない。
Javaでは拡大方向の暗黙的型変換が許容されているがkotlinでは不可。
以下、Int型の変数をLomg型の変数に代入しようとしているがN.G.。

変数宣言時の初期化の際にも暗黙の型変換が効かないので、
型サフィックスを付けて、変数の型と初期値を一致させる必要がある。

基本的に、というのは、整数リテラルについては暗黙の型変換が行われる。割り切り。

explicitな型変換

基本的にimplicitな型変換に頼らないで、explicitに型変換する方が良さそう。

配列型

配列型はC++のジェネリックみたいに書く。
getter/setter,iterator,accessorが準備されていて使いやすい。
nullableも指定できる。

intArrayOf()はArrayを返すので、型推論のヒントとして与えることができる。

Ruby風に、配列生成の初期値としてラムダ式を与えることができる。
Arrayの第1引数は配列のサイズ、第2引数はラムダ式。
第2引数のラムダ式の中に現れる変数iはラムダに渡される変数であってiでなくても何でも良い。
ラムダと高階関数は後で出てくるのでそこで。

配列のアクセサは[...]演算子を使う。
範囲外アクセスは実行時例外。

コレクション

arrayの他に、list,set,mapなどがある。

定数

kotlinの定数はval予約語により定義する。
定数への再代入は不可。コンパイル前にIntteliJ IDEAでエラーがわかる。

要はfinalなので、変数自体は変更できないが、変数の中身は変更できる。
例えば、配列を定数として定義したとき、配列自体を変更できないが、中身を変更できる。

-kotlin
-

Copyright© ikuty.com , 2018 AllRights Reserved Powered by AFFINGER4.