4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

はじめてのスコープ関数

Last updated at Posted at 2018-06-24

はじめに

真面目にAndroidアプリを作ろうと決意したので、学習したことの備忘録として書いてます。
下記のサイトを参考にさせてもらいました。
https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e

スコープ関数とは

引数にとる関数のスコープを変更するための関数。(クロージャと同じ?)
基本的には、複数処理をまとめたい場合に使用する。

let

定義

public inline fun <T, R> T.let(f: (T) -> R): R = f(this)

特徴

  • 拡張関数であるため、自分自身をゴニョゴニョするときに使う
  • Nullableな値に使用すると、nullの場合はnullを返し、nullでない場合は関数の実行結果を返す。

使用例

nullableな値をすべて大文字にし、逆にする。

val hoge: String? = "hoge"
val result = hoge?.let {
  it.toUpperCase()
  it.reversed()
}

with

定義

public inline fun<T, R> with(receiver: T, f: T.() -> R):R = receiver.f()

特徴

  • 拡張関数ではなく、ただの関数
  • 最後の実行式を返す

使用例

ユーザークラスのnameとageのプロパティに値を設定する

val user = with(User(), {
    name = "taro"
    age = 20
    this
})

上記のようにオブジェクトに値を設定したい場合は、後述するapplyを使うほうが適しているかもしれない。

run

定義

public inline fun<T, R> T.run(f: T.() -> R):R = f()

特徴

  • 拡張関数
  • 実行結果を返す
  • letとwithを合体させた感じ

使用例

val user = User().run {
    name = "taro"
    age = 20
}

apply

定義

public inline fun<T> T.apply(f: T.() -> Unit): T { f(); return this }

特徴

  • レシーバーを返す。
  • レシーバーのオブジェクトに対して何かを設定したりするときに使用する。
  • レシーバーのオブジェクトに対して、関数の実行結果を返すわけではないので何も起こらない。

使用例

ユーザークラスのnameとageのプロパティに値を設定する。

val user = User().apply {
    name = "taro"
    age = 20
}

オブジェクトに対して何かを設定するときに使用する。

 最後に

自分でも完全に理解できていないので随時更新していきます。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?