Kotlinのwithの使い方!レシーバーを切り替える使い方のポイント
生徒
「Kotlinのコードで、同じ変数に何度もアクセスしてると見づらくなることってありませんか?」
先生
「ありますね。そんなときに便利なのがwithという関数です。オブジェクトに対する処理をまとめて書けるんですよ。」
生徒
「それは便利そうですね!具体的にどんなふうに使うんですか?」
先生
「それでは、初心者にもわかるようにwithの使い方を説明していきましょう!」
1. Kotlinのwithとは?基本の考え方
Kotlin(ことりん)のwith関数は、特定のオブジェクトに対する処理をひとまとまりに書くための機能です。
たとえば、同じ変数のプロパティや関数を何回も使いたいとき、毎回その変数名を書くのは面倒ですよね。
そんなとき、withを使えば、その変数をレシーバー(処理の対象)として、thisを省略して書けるようになります。
2. withの基本的な書き方と構文
withの基本的な構文は以下のようになります。
with(対象の変数) {
// この中でthisが省略できる
プロパティや関数を呼び出す
}
たとえば、以下のようなコードになります。
fun main() {
val str = "Kotlin入門"
val result = with(str) {
println("文字数:${length}")
println("大文字:${uppercase()}")
length
}
println("戻り値:$result")
}
この例では、strに対する処理をwithの中でまとめて実行しています。lengthやuppercase()などをthisを省略して書けています。
3. withとレシーバーとは?初心者向けに解説
レシーバーとは、「処理の対象となるオブジェクト」のことです。つまりwith(str)と書いたら、strがそのあとの処理の中心になります。
このレシーバーが一時的に切り替わることで、何度もstr.と書かなくても済むようになるわけです。
初心者でも、「この中ではstrが主役なんだな」と思えば、理解しやすくなります。
4. withの戻り値に注目しよう
with関数の中の最後の行の値が、戻り値として返されます。
さきほどの例でいうと、lengthが最後なので、その値がresultに入ります。
val result = with("Kotlin") {
println("処理中:$this")
this.length
}
println("長さ:$result")
このように、withは処理だけでなく、値の計算にも使えるんですね。
5. オブジェクトの初期化や整形にも使えるwith
withは、たとえば文字列の整形やオブジェクトの設定処理にも活用できます。
val message = with(StringBuilder()) {
append("こんにちは、")
append("世界!")
toString()
}
println(message)
この例では、StringBuilderを使って文字を追加し、最後に文字列として返しています。レシーバーがStringBuilderに切り替わっているので、毎回書く必要がありません。
6. withと他のスコープ関数との違い
Kotlinにはapplyやrunなど他にもスコープ関数がありますが、withの違いは次のとおりです。
withは関数として使い、レシーバーを指定して処理をまとめるapplyはオブジェクトの設定向き(主に初期化)runはオブジェクトから戻り値を得たいときに使う
初心者のうちは、withは「この中で対象をまとめて処理するもの」と覚えておきましょう。
7. withを使うときの注意点
withはとても便利ですが、以下のような注意点もあります。
- 処理が長くなりすぎると、どの変数が主役かわからなくなる
- ネスト(入れ子)にしすぎると、かえって読みにくくなる
- 読み手にとってわかりやすい長さに留める
シンプルに書ける範囲で活用するのがポイントです。
8. Kotlin初心者がwithを練習する方法
初心者がwithの感覚を身につけるには、まず以下のような練習がおすすめです。
- 文字列やリストを
withで操作する StringBuilderで文を作る練習をする- オブジェクトの複数の値を処理するケースで使ってみる
まずは身近な処理からwithを使い、使い方に慣れていきましょう。