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
module T1
def foo
"foo"
end
trait T1 {
end
def foo = "foo"
}
module T2
def bar
trait T2 {
"bar"
def bar = "bar"
end
}
end
class A extends T1 with T2
class A
include T1
val a = new A
include T2
a.foo // "foo"
end
a.bar // "bar"
a = A.new
a.foo # => "foo"
a.bar # => "bar"
12. Singleton
class A
def foo
"instance" class A {
end def foo = "instance"
}
class << self
def foo object A {
"singleton" def foo "singleton"
end }
end
end new A().foo // "instance"
A.foo // "singleton"
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 class Duck {
def quack def quack
def walk def walk
end }
class Dove class Dove {
def quack def quack
def walk def walk
end }
class Cat class Cat
end
def quackAndWalk(a: { def quack; def walk }) = {
def quack_and_walk(animal) a.quack
animal.quack a.walk
animal.walk }
end
quackAndWalk(new Duck)
quack_and_walk Duck.new quackAndWalk(new Dove)
quack_and_walk Dove.new quackAndWalk(new Cat) // Compile error
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