Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scala for Ruby programmers

Scala for Ruby programmers

Tymon Tobolski

March 30, 2013
Tweet

More Decks by Tymon Tobolski

Other Decks in Programming

Transcript

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

    • kompilowany do JVM • intergacja z Java
  2. 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 }
  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. serio? List(1,2,3) map { e => e * 2 }

    // List[Int] = List(2, 4, 6)
  5. 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
  6. Monkey patching Implicit conversions implicit def Int2Time(i: Int) = new

    { def days = i * 24* 60 * 60 } 2.days // 172800
  7. 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"
  8. 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"
  9. Singleton class A def foo "instance" end class << self

    def foo "singleton" end end end A.new.foo # => "instance" A.foo # => "singleton"
  10. 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"
  11. 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
  12. 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
  13. 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
  14. DSL class FilterExample extends ScalatraFilter { get("/hello") { <p> Hello

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

    :: list println(list) // List(2, 3) println(list2) // List(1, 2, 3)
  16. 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>
  17. 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)
  18. 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
  19. 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)
  20. 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
  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> 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
  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) 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