1. ホーム
  2. kotlin

[解決済み] Kotlinの'let'キーワードの目的は何ですか [重複]。

2022-03-05 12:27:17

質問

の有無にかかわらず、コードを書くことができます。 let を以下のように設定します。

var str = "Hello World"
str.let { println("$it!!") }

または

var str = "Hello World"
println("$str!!")

の実際の使い方は? let ?その方がメモリ効率が良いのか、可読性が高いのか?

どのように解決するのですか?

let はKotlinの スコープ この関数を使うと、あるオブジェクトのコンテキスト内でコードブロックを実行することができます。この場合、コンテキストオブジェクトは str . その数は5つ。 let , run , with , apply および also . これらの用途は、初期化、マッピングなど多岐にわたりますが、それだけにとどまりません。

これらはすべて非常によく似ていますが、コンテキストオブジェクトの参照方法と返される値が異なります。の場合は let コンテキストオブジェクトは it キーワードとは対照的に this キーワードを使用します。戻り値は、ラムダコードブロックから返されたものである。他のスコープ関数である apply は代わりにコンテキストオブジェクトを返します。

なぜなら let はラムダブロックが評価されたものを返すので、何らかのマッピングを行うのに適しています。

var upperStr = str.let { it.toUpperCase()}

適用 の方が、より適切な機能です。

どちらのコードがより好ましいかという質問に対しては、スコープ関数を何のために使うのかによります。上の例では let . IntelliJ を使用している場合、この呼び出しを行うと警告が表示されます。 let は冗長です。ここでの読みやすさは好みの問題であり、好ましいかもしれません。

let 関数は、Object に対して null セーフな操作を行いたい場合に便利です。 safe call 演算子 ?. これを行う場合 let のコードブロックは、オブジェクトがヌルでない場合にのみ実行されます。let を使うもう一つの理由は、操作のために新しい変数を導入する必要があるけれども、それを let ブロックのスコープ内に限定したい場合です。これはすべてのスコープ関数に言えることなので、繰り返し言いますが let は、マッピング操作に使うのが最適です。

編集 let 関数は追加コストを発生させないはずです。通常、我々はラムダ/コードブロックがコンパイルされる際に Function オブジェクトの場合ですが、これは inline 関数の場合、コンパイラはあなたが示した2番目のコード例と同じようなコードを出力します。例えば ドキュメント をご覧ください。