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

Scala for Ruby programmers

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Scala for Ruby programmers

Avatar for Tymon Tobolski

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