/* Page prose (ja) */
"VersionBModern" = "# バージョン B（モダン）: `async`/`await` + `async let`\n\n同じタスクです。各取得は今や、値を返すか `throws` する**非同期関数**です。両方を **`async let`** で開始して並行に実行し、両方をまとめて `await` し、組み合わせ、`@MainActor` に任せてメインスレッドへ移動します。手作業の移動はありません。";
"VersionBModern-2" = "**実行して確認:** 出力は同一です。\n\n* callout(出力):\n`Fetching menu and stock...`  \n`Sellable today: [\"Latte\", \"Espresso\"]`\n\nそしてタイミングも同一です（どちらも並列で実行され、合計で約 0.6 秒）。`Task` が完了する間、Playground ページは実行され続けます。\n\n* callout(試してみよう): `fetchMenu` の sleep を `.milliseconds(1200)` に上げてみましょう。合計時間は両方の合計ではなく、*最も遅い*取得に従います。それでも最初に表示されるのはどの行でしょうか？\n\nさて、何が消えたか見てみましょう。\n\n* **共有された可変変数がない。** `menu` と `stock` は単なる値です。\n* **`enter`/`leave` がない。** `async let` が各子タスクを開始し、`try await (menu, stock)` が結合です。釣り合わせるカウンターはありません。\n* **エラーの経路が 1 つ。** `fetchMenu` か `fetchStock` のどちらかがスローすると、唯一の `catch` に到達します。2 つのオプショナルをアンラップすることも、`.get()` を呼ぶこともありませんでした。\n* **手作業のメインスレッド移動がない。** 関数に付いた `@MainActor` *こそ*が保証です。関数がそこに分離されているので、組み合わせと `print` はメイン actor で実行されます。メインに戻り忘れることはもはや不可能です。\n\nロジックである `filter` は、今や関数の中で最も目立つ行です。その周りにあったすべてが道を空けたからです。\n\n---\n\n## 違いを実感する\n\n* **共有された可変状態。** クラシック: 2 つの `Result?` 変数。モダン: なし。\n* **「両方を待つ。」** クラシック: `enter`/`leave` を伴う `DispatchGroup`。モダン: `await` を伴う `async let`。\n* **エラー処理。** クラシック: オプショナルをアンラップしてから `try`/`catch`。モダン: 1 つの `try`/`catch`。\n* **メインスレッドでの引き渡し。** クラシック: 忘れずに `notify(queue: .main)`。モダン: `@MainActor`、自動的に。\n* **本来のタスクではない行。** クラシック: 多い。モダン: 少ない。\n* **メインへの移動忘れをコンパイラが捕まえる。** クラシック: いいえ。モダン: はい。\n\n同じ振る舞い、同じ並列性、同じ出力ですが、B はそれが*意味する*ことを述べ、以前は頭の中で抱えておく必要があった部分をコンパイラに強制させます。それが、1 つの例で示すモダンモデルの主張のすべてです。\n\n[前へ](@previous)  |  4 / 8 ページ  |  [次へ: 実践におけるクラシックとモダン](@next)";
