- Scala編程(第5版)
- (德)馬丁·奧德斯基等
- 1466字
- 2022-05-06 15:51:47
6.10 Scala中的標識符
至此,你已經看到了Scala中構成標識符的兩種最重要的形式:字母數字組合,以及操作符。Scala對于標識符有著非常靈活的規則。除了你見過的這兩種,還有另外兩種。本節我們將介紹標識符的4種構成形式。
字母數字組合標識符(alphanumeric identifier)以字母或下畫線開頭,可以包含更多的字母、數字或下畫線。字符“$”也算作字母;不過,它被預留給那些由Scala編譯器生成的標識符。即使能通過編譯,用戶程序的標識符也不應該包含“$”符號,如果包含了該符號,則會面臨與編譯器生成的標識符沖撞的風險。
Scala遵循了Java使用駝峰命名法(camel-case)[5]命名標識符的規則,如toString和HashSet。雖然下畫線是合法的標識符,但是它在Scala程序中并不常用,其中一部分原因是與Java保持一致,不過另一個原因是下畫線在Scala代碼中還有許多其他非標識符的用法。因為上述原因,最好不使用像to_string、__init__或name_這樣的標識符。字段、方法參數、局部變量和函數的駝峰命名應該以小寫字母開頭,如length、flatMap和s等。類和特質的駝峰命名應該以大寫字母開頭,如BigInt、List和UnbalancedTreeMap等。[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_VALUE或PI。而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`()。
- Getting Started with React
- 算法精粹:經典計算機科學問題的Python實現
- Web Application Development with R Using Shiny(Second Edition)
- Spring Cloud、Nginx高并發核心編程
- Access 2016數據庫管
- Spring Boot進階:原理、實戰與面試題分析
- Learning Unity 2D Game Development by Example
- Learning Raspbian
- Learning R for Geospatial Analysis
- 軟件測試教程
- HTML5開發精要與實例詳解
- 大話Java:程序設計從入門到精通
- Buildbox 2.x Game Development
- 工業機器人離線編程
- 分布式架構原理與實踐