官术网_书友最值得收藏!

6.10 Scala中的標識符

至此,你已經看到了Scala中構成標識符的兩種最重要的形式:字母數字組合,以及操作符。Scala對于標識符有著非常靈活的規則。除了你見過的這兩種,還有另外兩種。本節我們將介紹標識符的4種構成形式。

字母數字組合標識符alphanumeric identifier)以字母或下畫線開頭,可以包含更多的字母、數字或下畫線。字符“$”也算作字母;不過,它被預留給那些由Scala編譯器生成的標識符。即使能通過編譯,用戶程序的標識符也不應該包含“$”符號,如果包含了該符號,則會面臨與編譯器生成的標識符沖撞的風險。

Scala遵循了Java使用駝峰命名法camel-case[5]命名標識符的規則,如toStringHashSet。雖然下畫線是合法的標識符,但是它在Scala程序中并不常用,其中一部分原因是與Java保持一致,不過另一個原因是下畫線在Scala代碼中還有許多其他非標識符的用法。因為上述原因,最好不使用像to_string、__init__或name_這樣的標識符。字段、方法參數、局部變量和函數的駝峰命名應該以小寫字母開頭,如length、flatMaps等。類和特質的駝峰命名應該以大寫字母開頭,如BigInt、ListUnbalancedTreeMap等。[6]

注意

在標識符的末尾使用下畫線的一個后果是,如果像這樣來聲明一個變量——“val name_: Int = 1”,則會得到一個編譯錯誤。編譯器會認為要聲明的變量名稱是“name_:”。要讓這段代碼通過編譯,需要在冒號前額外插入一個空格,就像這樣:“val name_ : Int = 1”。

在常量命名上,Scala的習慣與Java不同。在Scala中,常量constant)這個詞并不僅僅意味著val。雖然val在初始化之后確實不會變,但它仍然是一個變量。舉例來說,方法參數是val,但每次調用方法時,這些val都可以獲得不一樣的值。而一個常量則更固定。例如,scala.math.Pi被定義成最接近π(即圓周長和直徑的比例)的雙精度浮點數值。這個值不太可能會變化,因此,Pi顯然是一個常量。還可以用常量來表示代碼中那些不這樣做就會成為魔數magic number)的值:即沒有任何解釋的字面量,最差的情況是它甚至出現多次。你可能還會在模式匹配中用到常量,在13.2節將介紹一個具體的用例。Java對常量的命名習慣是全大寫,并用下畫線分隔不同的單詞,如MAX_VALUEPI。而Scala的命名習慣是只要求首字母大寫。因此,以Java風格命名的常量,如X_OFFSET,在Scala中也可以正常工作,不過Scala通常使用駝峰命名法命名常量,如XOffset。

操作標識符operator identifier)由一個或多個操作符構成。操作符指的是那些可以被打印出來的ASCII字符,如+、:、?、~、#等。[7]下面是一些操作標識符舉例:

Scala編譯器會在內部將操作標識符用內嵌$的方式轉換成合法的Java標識符。比如,:->這個操作標識符會在內部表示為$colon$minus$greater。如果你打算從Java代碼中訪問這些標識符,就需要使用這種內部形式。

由于Scala的操作標識符支持任意長度,因此Java與Scala在這里有一個細微的差異。在Java中,x<-y這樣的代碼會被解析成4個語法符號,等同于x < - y。而在Scala中,<-會被解析成一個語法符號,所以給出的解析結果是x <- y。如果你想要的效果是前一種,則需要用空格將<-分開。這在實際使用中不太會成為問題,因為很少有人會在Java中連著寫x<-y而不在中間加上空格或括號。

混合標識符mixed identifier)由一個字母數字組合標識符、一個下畫線和一個操作標識符組成。例如,unary_+表示+操作符的方法名,myvar_=表示賦值的方法名。除此之外,形如myvar_=這樣的混合標識符也被Scala編譯器用來支持屬性(properties),更多內容詳見第16章。

字面標識符literal identifier)是用反引號括起來的任意字符串(`...`)。字面標識符舉例如下:

可以將任何能被運行時接收的字符串放在反引號中,作為標識符。其結果永遠是一個(合法的)Scala標識符。甚至當反引號中的名稱是Scala保留字reserved word)時也生效。一個典型的用例是訪問Java的Thread類的靜態方法yield。不能直接寫Thread.yield(),因為yield是Scala的保留字。不過,仍然可以在反引號中使用這個方法名,就像這樣:Thread.`yield`()

主站蜘蛛池模板: 辽阳县| 饶平县| 泗阳县| 石棉县| 如东县| 虎林市| 松溪县| 贵定县| 新密市| 外汇| 清流县| 美姑县| 荔波县| 新竹市| 牡丹江市| 高州市| 泽库县| 安阳县| 华安县| 清流县| 满洲里市| 岳阳市| 崇义县| 佳木斯市| 潞西市| 文昌市| 滨海县| 德格县| 浦城县| 通江县| 双柏县| 汶川县| 曲阳县| 富源县| 侯马市| 措勤县| 龙江县| 师宗县| 图片| 纳雍县| 共和县|