私はthis questionを読みましたが、crossinline
キーワードに関するより根本的な質問があります。私は本当にどのような問題が解決しているのか、それがどのように解決するのかは分かりません。 the Kotlin Docsからコトリンのクロスインラインキーワード
、いくつかのインライン機能は、ローカルオブジェクトまたはネストされた関数として機能体から、しかし別の実行コンテキストから直接ではなく、パラメータとして渡されたラムダを呼び出すことが
注意。 の場合、では、非ローカル制御フローもラムダでは許可されません。この文は、私には曖昧である
[強調追加]
:、ラムダパラメータはcrossinline修飾子でマークする必要ことを示すために。まず、「そのような事件」が意味することを実際に描写するのに問題があります。私は問題が何であるかという一般的な考え方を持っていますが、その良い例を考え出すことはできません。
第2に、「それを示す」という言葉は、複数の方法で読むことができます。何を示す?その特定の場合は許可されていませんか?それははですか?与えられた関数定義における非局所的な制御フローが許可されている(または許可されていない)のですか?
要するに、これを実際に使用するためのコンテキスト、クライアントとの通信の使用方法、およびこのキーワードを適用すると期待される結果が何であるかを把握することができません。
したがって、 'crossinline'キーワードは、ラムダが関数内でラムダが使用される方法から決定的意味を持たない' return'キーワードを含むことを防ぎます(ローカルではない戻り値)。 – melston
私はまた、ラベルでのリターンは 'crossinline'の使用によって影響を受けないと仮定します。 – melston
@melston、はい、それは* local *である限りです。つまり、 'someList.forEach {item-> someCrossInline {return @ forEach item}}'は許されません。これは 'crossinline'ラムダのローカルではない戻り値ですが、' someList.forEach {item-> someCrossInline {return @someCrossInline item}} 'は大丈夫です(コメントに大きなコードをつけて申し訳ありません)。 – hotkey