Scala for Ruby programmers

Scala for Ruby programmers

9fae8c5d475fe322a3a74e53d56ee2a0?s=128

Tymon Tobolski

March 30, 2013
Tweet

Transcript

  1. scala dla programistów ruby :) Tymon Tobolski http://teamon.eu

  2. Scala - ??? • OOP + FP • statycznie typowany

    • kompilowany do JVM • intergacja z Java
  3. scala jest trudna trait FilterMonadic[+A, +Repr] { def map[B, That](f:

    A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That // ... } def zipWithIndexIf[T](list: List[T])(pred: T => Boolean): List[(T, Option[Int])] = { type R = List[(T, Option[Int])] def doZip(zipped: R, left: List[T], index: Int): R = left match { case x :: xs if pred(x) => doZip((x, Some(index)) :: zipped, xs, index + 1) case x :: xs => doZip((x, None) :: zipped, xs, index) case Nil => zipped } doZip(Nil, list, 0).reverse }
  4. scala jest trudna trait FilterMonadic[+A, +Repr] { def map[B, That](f:

    A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That // ... } def zipWithIndexIf[T](list: List[T])(pred: T => Boolean): List[(T, Option[Int])] = { type R = List[(T, Option[Int])] def doZip(zipped: R, left: List[T], index: Int): R = left match { case x :: xs if pred(x) => doZip((x, Some(index)) :: zipped, xs, index + 1) case x :: xs => doZip((x, None) :: zipped, xs, index) case Nil => zipped } doZip(Nil, list, 0).reverse }
  5. serio? List(1,2,3) map { e => e * 2 }

    // List[Int] = List(2, 4, 6)
  6. serio? List(1,2,3) map { e => e * 2 }

    // List[Int] = List(2, 4, 6) List(1,2,3) map (_*2) // List[Int] = List(2, 4, 6) List(1,2,3) map (2*) // List[Int] = List(2, 4, 6) List(1,2,3) filter { _ > 1 } // List[Int] = List(2, 3) (1 to 10) foreach { e => println(e) } (1 to 10) foreach println
  7. Monkey patching 2.days

  8. Monkey patching Implicit conversions implicit def Int2Time(i: Int) = new

    { def days = i * 24* 60 * 60 } 2.days // 172800
  9. Modules / Traits module T1 def foo "foo" end end

    module T2 def bar "bar" end end class A include T1 include T2 end a = A.new a.foo # => "foo" a.bar # => "bar"
  10. Modules / Traits trait T1 { def foo = "foo"

    } trait T2 { def bar = "bar" } class A extends T1 with T2 val a = new A a.foo // "foo" a.bar // "bar" module T1 def foo "foo" end end module T2 def bar "bar" end end class A include T1 include T2 end a = A.new a.foo # => "foo" a.bar # => "bar"
  11. Singleton class A def foo "instance" end class << self

    def foo "singleton" end end end A.new.foo # => "instance" A.foo # => "singleton"
  12. Singleton class A { def foo = "instance" } object

    A { def foo "singleton" } new A().foo // "instance" A.foo // "singleton" class A def foo "instance" end class << self def foo "singleton" end end end A.new.foo # => "instance" A.foo # => "singleton"
  13. Duck typing class Duck def quack def walk end class

    Dove def quack def walk end class Cat end def quack_and_walk(animal) animal.quack animal.walk end quack_and_walk Duck.new quack_and_walk Dove.new quack_and_walk Cat.new # NoMethodError
  14. Duck typing class Duck { def quack def walk }

    class Dove { def quack def walk } class Cat def quackAndWalk(a: { def quack; def walk }) = { a.quack a.walk } quackAndWalk(new Duck) quackAndWalk(new Dove) quackAndWalk(new Cat) // Compile error class Duck def quack def walk end class Dove def quack def walk end class Cat end def quack_and_walk(animal) animal.quack animal.walk end quack_and_walk Duck.new quack_and_walk Dove.new quack_and_walk Cat.new # NoMethodError
  15. DSL class StackSpec extends FlatSpec with ShouldMatchers { "A Stack"

    should "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should equal (2) stack.pop() should equal (1) } it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[String] evaluating { emptyStack.pop() } should produce [NoSuchElementException] } } http://scalatest.org
  16. DSL class FilterExample extends ScalatraFilter { get("/hello") { <p> Hello

    world </p> } post("/world") { // ... } } https://github.com/scalatra/scalatra
  17. Immutability val list = List(2, 3) val list2 = 1

    :: list println(list) // List(2, 3) println(list2) // List(1, 2, 3)
  18. Built-in concurency scala> (1 to 10) foreach println 1 2

    3 4 5 6 7 8 9 10
  19. Built-in concurency scala> (1 to 10).par foreach println 1 2

    3 4 5 8 9 10 6 7
  20. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2)
  21. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2) scala> Map(1 -> 2) get _ res10: (Int) => Option[Int] = <function1>
  22. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2) scala> Map(1 -> 2) get _ res10: (Int) => Option[Int] = <function1> scala> Map(1 -> 2) get 1 res11: Option[Int] = Some(2)
  23. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2) scala> Map(1 -> 2) get _ res10: (Int) => Option[Int] = <function1> scala> Map(1 -> 2) get 1 res11: Option[Int] = Some(2) scala> Map(1 -> 2) get 3 res12: Option[Int] = None
  24. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2) scala> Map(1 -> 2) get _ res10: (Int) => Option[Int] = <function1> scala> Map(1 -> 2) get 1 res11: Option[Int] = Some(2) scala> Map(1 -> 2) get 3 res12: Option[Int] = None scala> Map(1 -> 2) get 1 map (1+) res13: Option[Int] = Some(3)
  25. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2) scala> Map(1 -> 2) get _ res10: (Int) => Option[Int] = <function1> scala> Map(1 -> 2) get 1 res11: Option[Int] = Some(2) scala> Map(1 -> 2) get 3 res12: Option[Int] = None scala> Map(1 -> 2) get 1 map (1+) res13: Option[Int] = Some(3) scala> Map(1 -> 2) get 3 map (1+) res14: Option[Int] = None
  26. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2) scala> Map(1 -> 2) get _ res10: (Int) => Option[Int] = <function1> scala> Map(1 -> 2) get 1 res11: Option[Int] = Some(2) scala> Map(1 -> 2) get 3 res12: Option[Int] = None scala> Map(1 -> 2) get 1 map (1+) res13: Option[Int] = Some(3) scala> Map(1 -> 2) get 3 map (1+) res14: Option[Int] = None scala> Map(1 -> 2) get 1 map (1+) getOrElse 5 res15: Int = 3
  27. Functional style scala> Map(1 -> 2) res9: scala.collection.immutable.Map[Int,Int] = Map(1

    -> 2) scala> Map(1 -> 2) get _ res10: (Int) => Option[Int] = <function1> scala> Map(1 -> 2) get 1 res11: Option[Int] = Some(2) scala> Map(1 -> 2) get 3 res12: Option[Int] = None scala> Map(1 -> 2) get 1 map (1+) res13: Option[Int] = Some(3) scala> Map(1 -> 2) get 3 map (1+) res14: Option[Int] = None scala> Map(1 -> 2) get 1 map (1+) getOrElse 5 res15: Int = 3 scala> Map(1 -> 2) get 3 map (1+) getOrElse 5 res16: Int = 5
  28. Web • Rails • Sinatra • ... • Play! •

    Lift • Scalatra • ...
  29. • Actors • STM • Fault Tolerance • ...

  30. • http://scala-lang.org • http://akka.io • http://typesafe.com • http://scala.playframework.org/ • #scala

    @ irc.freenode.net • #scala.pl @ irc.freenode.net