Advertisement

More Related Content

Advertisement

Recently uploaded(20)

Advertisement

Rubyistを誘うScalaの世界

  1. Rubyistを誘う Scalaの世界 @Peranikov
  2. ドーモ、 ルビースト=サン
  3. Scalaistデス
  4. 今日はRubyistの皆様に Scalaの魅力を 伝えるために来ました
  5. どうやってつたえるか • Rubyの魅力(と思われるもの)をScalaで再現す れば良い • 型をなるべく書かない(Rubyistに型を見せると 死ぬ)
  6. Scalaは純粋な オブジェクト指向 である
  7. 1 + 2 これをな
  8. 1.+(2) +メソッド +メソッドの引数 こうじゃ
  9. 1.+(2) +メソッド +メソッドの引数 RubyでもScalaでも通る!
  10. リスト操作
  11. どっちのコードか? [1,2,3].map { ¦i¦ i * 2 }
  12. 正解:Ruby [1,2,3].map { ¦i¦ i * 2 }
 # => [2, 4, 6]
  13. Scalaではこう書く List(1,2,3).map { i => i * 2 }
 // => List(2, 4, 6)
  14. さらに短く List(1,2,3).map { _ * 2 }
 // => List(2, 4, 6) ※ _ には引数が代入される
  15. おなじみのメソッド達 • min • max • reduce • zip • unzip
  16. Mix-In
  17. RubyにはModule、 ScalaにはTraitがある trait HelloModule { def hello = "Hello!" } trait WorldModule { def world = "World!" } class Hoge extends HelloModule with WorldModule val hoge = new Hoge() hoge.hello // => "Hello!" Traitを定義 TraitをMix-In
  18. Open Class
  19. 暗黙クラスを使う implicit class MyString(val s: String) extends AnyVal { def addScala = s + "Scala" } "Ruby is like ".addScala // => "Ruby is like Scala" 拡張したい型を指定 implicitにより暗黙的に型変換され、MyStringの メソッドが呼ばれる
  20. Duck Typing
  21. がんばればできる
 (structural subtyping) type Hogeable = { def hoge(s: String):String }
 
 def addFuga(t: Hogeable): String = { t.hoge + fuga! } class Hoge { def hoge = hoge! } addFuga(new Hoge()) // => hoge!fuga! 共通するメソッドを持つ 型を定義 定義した型を 引数に指定 メソッドを持っていれば そのまま渡せる
  22. 結論 • Rubyの魅力(と思われるもの)は大体Scalaで再 現できた(はず) • Scala書こうぜ!
  23. 終わり
  24. メタプログラミングは? • そんなものにふれてはいけない
  25. メタプログラミングは??? • 一応ScalaにもReflectionやMacroが存在する • まだEXPERIMENTAL • 触ってみたが面倒くさかった
 (Rubyほどカジュアルに使えない)
Advertisement