モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

Scala で YAML を読み込む方法 (の代替)

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2016/02/09
最終更新最終更新
2018/05/26
記事区分記事区分
一般公開

目次

    インフラ構築と自動化が得意。TerraformとAnsibleでインフラを自動構築するお仕事が多め

    インストール

    2016-2-9 現在のところ Scala で YAML を扱うこなれた方法はないようです。ここでは SnakeYAML を利用します。

    build.sbt (sbt)

    libraryDependencies += "org.yaml" % "snakeyaml" % "1.16"
    

    pom.xml (maven)

    <dependency>
      <groupId>org.yaml</groupId>
      <artifactId>snakeyaml</artifactId>
      <version>1.16</version>
    </dependency>
    

    サンプルコード

    config.yaml (UTF-8)

    --- !!myapp.Person
    [
      鈴木, # 名字
      一郎, # 名前
      123, # 年齢
    ]
    

    Main.scala

    package myapp
    
    import org.yaml.snakeyaml.Yaml
    import scala.beans.BeanProperty
    import java.io.{File, FileInputStream}
    
    class Person(
      @BeanProperty var firstName: String,
      @BeanProperty var lastName: String,
      @BeanProperty var age: Int) {
      override def toString: String = {
        return firstName + ", " + lastName + ", " + age
      }
    }
    
    object Main {
      def main(args: Array[String]): Unit = {
        val yaml = new Yaml
        val input = new FileInputStream(new File("config.yaml"))
        val obj = yaml.load(input)
        val person = obj.asInstanceOf[Person]
        println(person) //=> 鈴木, 一郎, 123
        println(person.getAge()) //=> 123
      }
    }
    

    Scala コードを Eval

    設定ファイルとしての YAML を扱うことが難しい場合は、Scala コードを実行時に Eval することで代替できます。少し前までは Twitter 社が提供する util-eval を用いて Eval を実現していましたが、2.11 では Scala 公式のライブラリで Eval がサポートされています。sbt で依存関係を設定すると使用できるようになります。Scala 2.11.7 の場合は以下のようにします。Eval は重たい処理ですので頻繁に実行することは避けるようにします。

    libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.11.7"
    

    Main.scala

    package myapp
    
    import scala.tools.reflect.ToolBox
    import scala.reflect.runtime.currentMirror
    
    trait Config {
      val hostname: String
      val port: Int
    }
    
    object Main {
      def main(args: Array[String]): Unit = {
    
        val toolbox = currentMirror.mkToolBox()
    
        // 簡単な例
        val source: String = "List(1,2)"
        val tree = toolbox.parse(source)
        val result = toolbox.eval(tree).asInstanceOf[List[Int]]
        println(result) //=> List(1, 2)
    
        // 外部ファイルを利用する例
    
        // 既存のクラス List[Int]
        val listConfig = toolbox.eval(toolbox.parse(scala.io.Source.fromFile("./Config1.dat").mkString)).asInstanceOf[List[Int]]
        println(listConfig) //=> List(1, 2, 3)
    
        // 独自のクラス Config
        val config: Config = toolbox.eval(toolbox.parse(scala.io.Source.fromFile("./Config2.dat").mkString)).asInstanceOf[Config]
        println(config.hostname) //=> localhost
        println(config.port) //=> 80
      }
    }
    

    Config1.dat

    List(1,2,3)
    

    Config2.dat
    文法としては、トレイトをミックスインした無名クラスです。

    new myapp.Config {
      val hostname = "localhost"
      val port = 80
    }
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    インフラ構築と自動化が得意。TerraformとAnsibleでインフラを自動構築するお仕事が多め

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • Scala 文字列の処理
        書式指定 object Main { def main(args: Array[String]): Unit = { println("%d + %d = %d".format(1, 1, 2)) //=> 1 + 1 = 2 } } 文字列の比較 ヒアドキュメント 他の言語でいう「ヒアドキュメント」のようなものは """ で囲うことで実現できます。 object Main ...
        したくんしたくん5/18/2018に更新
        いいねアイコン画像0
      • Scala 日付に関する処理
        Date クラスを文字列にフォーマット import java.util.Date object Main { def main(args: Array[String]): Unit = { // format は Date に限らない文字列用の機能です。 println("%d-%d-%d" format (1, 1, 1)) //=> 1-1-1 printl...
        したくんしたくん5/5/2018に更新
        いいねアイコン画像0
      • 酢豚の基本的な使い方 (sbt)
        sbt は Scala および Java を主な対象としたビルドツールです。Scala Build Tool の略ではありませんが、Simple Build Tool という明示的な記述も公式ドキュメントなどには見当りません。以下 sbt の基本的な使用例をまとめます。使用した sbt のバージョンは 0.13 です。 公式ドキュメント [sbt 0.13](http://www.scala-sb...
        ねこねこ5/30/2018に更新
        いいねアイコン画像0
      • Scala 関数のサンプルコード
        「デフォルト引数」および「Unit 型を返す関数」 object HelloWorld { def main(args: Array[String]): Unit = { def myPrint(myArg: String = "default_value") = println(myArg + "!") val result = myPrint() //=> defau...
        したくんしたくん5/26/2018に更新
        いいねアイコン画像0
      • Scala 組み込みの制御構造
        if-else 条件分岐で知られる if-else は三項演算子のようにも使用されます。 object HelloWorld { def main(args: Array[String]): Unit = { val myVal = if (!args.isEmpty) args(0) else "default" println(myVal) } ...
        したくんしたくん9/7/2021に更新
        いいねアイコン画像0