Scala for Backend Engineering & Functional Programming · レッスン

ZIO アプリの実行

ZIOAppDefault です。

レッスン 4/413 ステップ

「ZIO アプリの実行」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

記述から実行へ

ZIOの値は設計図にすぎません。実行するにはZIOのランタイムに渡します。通常はランタイムを手動で呼び出すのではなく、ZIOAppDefaultを継承します。

ZIOAppDefault

ZIOAppDefaultを継承し、runを実装します。フレームワークがデフォルトサービス(Console、Clock、Random、System)を提供し、起動と終了を管理します。

import zio._

object Hello extends ZIOAppDefault {
  def run = Console.printLine("Hello, ZIO!")
}

runの値

runは、デフォルトサービスによって環境が満たされるZIOです。エラー型と成功型には柔軟性があり、ランタイムが失敗を報告して終了コードを設定します。

複数ステップのアプリ

for内包表記でアプリのロジックを組み立てます。各行はエフェクトであり、ランタイムによって順番に実行されます。

import zio._

object Greeter extends ZIOAppDefault {
  def run = for {
    _    <- Console.printLine("What is your name?")
    name <- Console.readLine
    _    <- Console.printLine(s"Hello, $name!")
  } yield ()
}

runでLayerを提供する

アプリがカスタムサービスに依存する場合は、runエフェクトにprovideを適用してLayerを渡し、実行前に環境の要件をすべて満たします。

import zio._

object App extends ZIOAppDefault {
  // def run = program.provide(MyService.layer)
  def run = ZIO.unit
}

終了コード

デフォルトでは、成功したrunはコード0で終了し、失敗した場合は0以外のコードで終了します。exitCodeを使って明示的なExitCodeを返すこともできます。

import zio._

object App extends ZIOAppDefault {
  def run = Console.printLine("done").exitCode
}

コマンドライン引数

ZIOApp.argsまたはgetArgsを介してZIOAppArgsでプログラムの引数にアクセスできます。戻り値はChunk[String]です。

import zio._

object App extends ZIOAppDefault {
  def run = for {
    args <- getArgs
    _    <- Console.printLine(s"args: ${args.mkString(", ")}")
  } yield ()
}

境界での失敗処理

ランタイムが簡潔なメッセージを表示できるよう、最上位でエラーを処理またはログ出力するのがよい習慣です。runでcatchAllまたはtapErrorを使用します。

import zio._

object App extends ZIOAppDefault {
  val logic = ZIO.fail("oops")
  def run = logic.catchAll(e => Console.printLine(s"Failed: $e"))
}

ファイバーのフォーク

runの内部では、エフェクトをforkしてファイバー上で並行実行し、後からjoinできます。ランタイムはすべてのファイバーを監視し、終了時に割り込みます。

import zio._

val prog = for {
  fiber  <- ZIO.succeed(40).fork
  result <- fiber.join
  _      <- Console.printLine(s"got $result")
} yield ()

手動によるUnsafe実行

ZIOAppDefaultの外部では、Unsafe.unsafeとRuntimeを使ってエフェクトを実行できます。ただし、これは通常のアプリケーションコードではなく、統合境界に限って使用します。

import zio._

// Unsafe.unsafe { implicit u =>
//   Runtime.default.unsafe.run(myEffect).getOrThrow()
// }

通常のScalaのmain

比較のため、自己完結型のScalaエントリーポイントを示します。ZIOAppDefaultはmainの役割を果たしながら、サービス、エラー報告、ファイバー監視を組み込みます。

object Main {
  def main(args: Array[String]): Unit = {
    println("Hello, ZIO!")
  }
}

クイックチェック

ZIOアプリケーションを実行する推奨方法は何ですか?

まとめ

ZIOアプリの実行方法を学びました。

  • runエフェクトを持つZIOAppDefault
  • デフォルトサービスとLayerのprovide
  • 終了コード、引数、最上位でのエラー処理
  • ファイバーのフォークとUnsafe境界

ZIO Fundamentalsコースを修了しました。

無料で開始

AI チューターと学ぶ Scala — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
39
レッスン
143

よくある質問

「ZIO アプリの実行」レッスンは無料ですか?

はい。「ZIO アプリの実行」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

「ZIO アプリの実行」で何を学びますか?

ZIOAppDefault です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ZIO アプリの実行」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ZIO エフェクト
  2. ZIO の合成
  3. エラーと依存性のチャネル
  4. ZIO アプリの実行
← Scala for Backend Engineering & Functional Programmingに戻る