inoutによるその場での変更
関数から呼び出し元の値を変更できるようにします
「inoutによるその場での変更」はCoddyKit上の無料Mojo Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMojo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Mojo Academyコースには全4レッスンが含まれています。
変更が必要な場合もある
借用では読み取りしかできません。しかし、カウンターを増やすなど、関数が呼び出し元の値を実際に変更する必要がある場合もあります。✏️
inoutを使う
inout規約を使うと、関数に変更可能なアクセス権を与えられます。関数内で行った変更は、呼び出し元の変数にも反映されます。
入力と出力
名前がすべてを表しています。値を入力し、変更すると、更新された値が呼び出し元に返されます。コピーは返されません。
パラメータを指定する
パラメータ名の前にinoutと記述します。これで、関数内での代入によって元の変数が直接更新されます。
fn increment(inout n: Int):
n += 1呼び出す
変数を渡し、呼び出し後に変化する様子を確認してください。関数は呼び出し元の値をその場で変更するため、戻り値は必要ありません。
var count = 5
increment(count)
print(count) # 6可変である必要がある
inoutパラメータに渡す引数は、可変なvarでなければなりません。固定リテラルや借用した値を渡すことはできません。
借用中は排他的
関数がinout参照を保持している間は、ほかのものがその値に触れることはできません。この排他性のルールによって、競合する変更を防げます。
隠れたコピーはない
借用と同じく、inoutは参照によって機能するため、完全なコピーは作成されません。複製のコストをかけずに変更できます。
所有権は呼び出し元に残る
inoutでは、呼び出し元が所有権を保持します。関数は呼び出し中だけ可変な形で借用し、その後は制御を返します。
inoutを選ぶ場面
関数の役割全体が、呼び出し元が使い続ける値を更新することである場合にinoutを使います。たとえば、バッファを拡張したりフィールドをリセットしたりする場合です。
読み取りと変更を比較する
ここまでの内容を整理すると、borrowedは読み取り専用、inoutは読み取りと書き込みを行います。適切なものを選ぶことで、関数の動作を読者に正確に伝えられます。
確認問題
inoutで何ができるのか確認しましょう。
まとめ
inoutを使うと、関数は呼び出し元の値を参照によってコピーなしで、その場で変更できます。呼び出し元は常に所有権を保持します。🎯
よくある質問
「inoutによるその場での変更」レッスンは無料ですか?
はい。「inoutによるその場での変更」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Mojo Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Mojo Academyコースには全4レッスンが含まれています。
「inoutによるその場での変更」で何を学びますか?
関数から呼び出し元の値を変更できるようにします ブラウザで直接実行するハンズオンコードでMojo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Mojo Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのMojo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「inoutによるその場での変更」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このMojo Academyレッスンでコードを書いて実行できますか?
はい。すべてのMojo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 読み取り専用で引数を借用する
- inoutによるその場での変更
- ownedによる所有権の取得
- Transfer演算子