2016年4月11日 星期一

[Scala 小學堂] Scala Gossic : 起步走 - 資料、變數、操作 (操作方法)

轉載自 這裡 
前言 : 
Scala 是一個可直譯、編譯、靜態、運行於 JVM 之上、可與 Java 互操作、融合物件導向編程特性與函式編程風格的程式語言. 從一些簡單的語法開始,了解 Scala 的許多特性,所以就算是起步走,東西也夠多了. 簡單的小程式可以使用 scala 指令,編譯的事就交給 scalac,編譯想快點就用 fsc. (Scala 官網), 所有的東西都是物件,所有的操作都是方法. 

操作方法 : 
Scala 提供了算術操作(Arithmetic operation)、關係操作(Rational operation)、邏輯操作(Logical operation)、位元操作(Bitwise operation)等對物件的基本操作 : 
* 算術操作:如+、-、*、/、%
* 關係操作:如>、>=、<、<=、==、!=
* 邏輯操作:如&&、||、!
* 位元操作:如&、|、~、^、>>、>>>、<<
* 指定操作:如+=、-=、*=、/=、%=、&=、|=、~=、>>=、>>>=、<<=

這些操作一般稱之為運算子(Operator),以下是一些實際運用 : 
scala> 1 + 2
res0: Int = 3

scala> 3 - 1
res1: Int = 2

scala> 3 * 10
res2: Int = 30

scala> 1 >= 2
res3: Boolean = false

scala> 1 | 2
res4: Int = 3


是的,表面上看起來,這些操作確實就像是運算子,不過,Scala 技術上而言,並沒有所謂的運算子,你所看到的 +、-、*'、/ 等操作,其實都是物件上的方法,下面的示範可以印證 : 
scala> (1).+(2)
res5: Int = 3

scala> (3).-(1)
res6: Int = 2

scala> (3).*(10)
res7: Int = 30

scala> (1).>=(2)
res8: Boolean = false 
scala> (1).|(2)
res9: Int = 3


在 Int 物件上,定義了 +、-、*、/ 等各個方法,上面的例子中,使用了方法的操作方式加以印證,在 Scala 中,物件要呼叫方法時,點(.)字元並非必要,且若方法只帶一個參數或不帶參數,則括號也可以省略。所以使得 +、-、*、/ 等操作,形式上看來就像一般程式語言中的運算子. 所以,你也可以如下操作物件上的一些方法 : 
scala> val x = 1L
x: Long = 1

scala> val y:Int = x toInt
y: Int = 1

scala> "abc" toUpperCase
res0: java.lang.String = ABC

scala> "abc" indexOf 'b'
res1: Int = 1


所以,你可以讓任何方法看來就像運算子,這是Scala支援語言擴充性的一種方式,在定義類別時,也可以定義+、-、*、/等方法,讓物件支援這些運算
對於 1+2 這樣的操作,+ 是 1 物件上的方法名稱,從+來看,1 與 2 是它的運算元,如果就一般程式語言來說,+ 是二元運算子。但對於 ~ 這樣的操作,是擺在某個數值或物件之前的運算,該如何於物件上定義方法呢? Scala 使用「unary_」作為這種前置運算的方法名稱前置,例如若要定義 ~ 這樣的運算,則在定義類別時定義「unary_~」這樣的方法名稱,當你呼叫 ~2,實際上等於呼叫 (2).unary_~
scala> ~2
res2: Int = -3

scala> (2).unary_~
res3: Int = -3

不過,Scala 限制可以作為前置運算的符號,只有 +、 - 、 ! 與 ~ 可以作為前置運算,如果你定義其它的符號,例如定義了 unary_#,你仍然可以使用 x.unary_# 的方式呼叫(x 參考至物件),但 #x 這樣的前置運算則是不行的(Scala 的將之解釋為 #.x)。 

Supplement 
Tutorialspoint - Scala Operators

沒有留言:

張貼留言

[Git 文章收集] Differences between git merge and git rebase

Source From  Here Preface Merging and rebasing are the two most popular way to applying changes from one branch into another one. They bot...