[Scala] Object Class Note: Cross Files Usage

object class 不能夠跨檔案 new,可能原因是 object 是 singleton, 這意味這整個專案就只能有一份 instance (?):
ex.
File A:object SampleClass{ ... }
File B:val sample = new SampleClass() => error: cannot resolve symbol SampleClass

但是可以直接存取使用:
ex.
File A:object SampleClass { def foo() = { ... } )
File B:val sample = SampleClass.foo() => passed!

如果使用 object class 來建立兩個物件:

val sample1 = SampleClass.foo()
val sample2 = SampleClass.foo()
print(sample1 == sample2)        => false

所以兩個實例是獨立的兩個物件

但是如果想要這樣:

val sample1 = SampleClass
val sample2 = SampleClass
print(sample1 == sample2)        => true
sample1.foo()
sample2.foo()

因為是直接指定 object 物件給新的變數,所以兩個指向的記憶體位置是相同的,因此比較結果是 true

[Scala] Quasiquote

String with Interpreter

scala> import scala.math.Pi
scala> Tau = 2 * Pi
scala> println(s"Happy $Tau Day")
     Happy 6.283185307179586 Day
scala> println("Happy $Tau Day")
     Happy $Tau Day
scala> val s1 = "$Tau"
     s1: String = $Tau
scala> val s2 = s"$Tau"
     s2: String = 6.283185307179586

所以 string 加上 s 是指要以 string interpreter 來處理這個字串

String in Quasiquote

而 string 前面加上 q 是 quasiquote,編譯器會自動將這個 string 變成一棵 tree
Quasiquote 是 Scala 2.11 以後的巨集工具,但預設不會載入模組
所以直接宣告 q"..." 會出現 value q is not a member of StringContext 的錯誤
解決方法:http://docs.scala-lang.org/overviews/quasiquotes/setup.html

在 Scala 2.11, in REPL,要先做些前置:

scala> val universe: reflect.runtime.universe.type = reflect.runtime.universe
scala> import universe._

接著就可以用了:

scala> val tree = q"i am { a quasiquote }"
tree: universe.Tree = i.am(a.quasiquote)

scala> println(tree match { case q"i am { a quasiquote }" => "it worked!" })
it worked!
螢幕快照 2014-11-04 上午3.46.12.png

在 IntelliJ 中,則要在檔案中引用:import reflect.runtime.universe._ 就可以了