1. 程式人生 > >Scala基礎教程(二):資料型別、變數

Scala基礎教程(二):資料型別、變數

基礎語法

關於Scala程式,這是非常要注意以下幾點。

·        區分大小寫 -  Scala是大小寫敏感的,這意味著標識Hello 和 hello在Scala中會有不同的含義。

·        類名 - 對於所有的類名的第一個字母要大寫。

如果需要使用幾個單詞來構成一個類的名稱,每個單詞的第一個字母要大寫。

示例:classMyFirstScalaClass

·        方法名稱 - 所有的方法名稱的第一個字母用小寫。

如果若干單詞被用於構成方法的名稱,則每個單詞的第一個字母應大寫。

示例:defmyMethodName()

·        程式檔名 - 程式檔案的名稱應該與物件名稱完全匹配。

儲存檔案時,應該儲存它使用的物件名稱(記住Scala是區分大小寫),並追加“.scala”為副檔名。 (如果檔名和物件名稱不匹配,程式將無法編譯)。

示例: 假設“HelloWorld”是物件的名稱。那麼該檔案應儲存為'HelloWorld.scala“

·        def main(args: Array[String]) - Scala程式從main()方法開始處理,這是每一個Scala程式的強制程式入口部分。

Scala修飾符:

所有的Scala的元件需要名稱。使用物件,類,變數和方法名被稱為識別符號。關鍵字不能用作識別符號和標識是區分大小寫的。Scala支援以下四種類型識別符號:

文字識別符號

字母數字識別符號開始以字母或下劃線,可以使用字母,數字或下劃線。“$”字元在Scala中是保留關鍵字,識別符號不能使用。以下是合法的字母識別符號:

age, salary, _value,  __1_value

以下是非法識別符號:

$salary,
123abc, -salary

運算子標識

運算子識別符由一個或多個運算子字元。操作字元是可列印的ASCII字元,如+, :, ?, ~ 或#。以下是合法的運算子標識:

+ ++ ::: <?> :>

Scala編譯器將在內部“軋”操作符識別符號使它們成為合法的Java識別符號,並嵌入$字元。例如,所述識別符號:->將內部表示為$colon$minus$greater。

混合識別符號

混合識別符號由一個字母數字識別符,隨後是一個下劃線和運算子標識。以下是合法的混合識別符號:

unary_+,  myvar_=

在這裡,作為一個方法名unary_+定義了一個一元+運算子和myvar_=用來作為方法名稱定義了一個賦值運算子。

立即數識別符號

一個文字標識是包含在反引號(` . . . `)的任意字串。以下是合法的文字標識:

`x` `<clinit>` `yield`

Scala關鍵字:

下面的列表顯示在Scala中的保留字。這些保留關鍵字不可以被用作常量或變數,或任何其他的識別符號名稱。

abstract

case

catch

class

def

do

else

extends

false

final

finally

for

forSome

if

implicit

import

lazy

match

new

null

object

override

package

private

protected

return

sealed

super

this

throw

trait

try

true

type

val

var

while

with

yield

-

:

=

=>

<-

<:

<%

>:

#

@

Scala中的註釋

Scala支援單行和多行註釋非常類似於Java。多行註釋可以巢狀,但必須正確巢狀。可用的任何註釋和所有字元都將被Scala編譯器忽略。

object HelloWorld {
   /* This is my first java program.  
* This will print 'Hello World' as the output
* This is an example of multi-line comments.
*/
   def main(args: Array[String]) {
      // Prints Hello World
      // This is also an example of single line comment.
      println("Hello, world!") 
   }
}

空行和空格:

僅包含空格,可能帶有註釋行,被稱為一個空行,並且Scala將會完全忽略它。標記可以通過空格和/或註釋分開。

換行符:

Scala是面向行的語言,語句可以用分號(;)結束或換行符。分號在宣告的結尾通常是可選的。可以鍵入一個想要的,如果語句出現其本身在一行。在另一方面,如果寫在一行多個語句分號是必需的:

val s = "hello"; println(s)

Scala包:

包是一個程式碼命名的模組。例如,Lift 實用包net.liftweb.util。包宣告是在原始檔中的第一個非註釋行,如下所示:

package com.liftcode.stuff

Scala的包可以被匯入,使他們能夠在當前編譯範圍內被引用。下面的語句是匯入scala.xml包的內容:

import scala.xml._

可以匯入封裝的類和物件,例如,從scala.collection.mutable匯入HashMap:

import scala.collection.mutable.HashMap

可以從一個單一封裝的scala.collection.immutable包匯入多個類或物件,例如,TreeMap和TreeSet:

import scala.collection.immutable.{TreeMap, TreeSet}

Scala的資料型別全部相同於Java中,具有相同的記憶體佔用和精度。以下表是有關可在Scala中所有的資料型別的細節:

資料型別

描述

Byte

8位有符號值。範圍從-128127

Short

16位有符號值。範圍從-3276832767

Int

32 位有符號值。範圍從 -2147483648 to 2147483647

Long

64位有符號值。-92233720368547758089223372036854775807

Float

32IEEE754單精度浮點數

Double

64IEEE754雙精度浮點數

Char

16位無符號Unicode字元。範圍由U+0000U+FFFF

String

字元序列

Boolean

無論是字面truefalse字面

Unit

對應於沒有值

Null

空或空引用

Nothing

每一個其他型別的子型別包括無值

Any

Any型別的超型別;任何物件是任何型別

AnyRef

任何引用型別的超型別

上面列出的所有的資料型別是物件。沒有原始的型別,如Java中。這意味著可以呼叫int,long等上的方法

Scala基本字面值:

Scala中使用的文字規則是簡單和直觀的。這部分解釋了所有Scala中的基本文字。

整數值

整數文字通常是int型別,或型別龍其次是L或l字尾的時候。下面是一些整數文字:

0
035
21 
0xFFFFFFFF 
0777L

浮點型

浮點文字是Float型別後跟一個浮點型別字尾F或f時,否則是Double型別。下面是一些浮點文字:

0.0 
1e30f 
3.14159f 
1.0e100
.1

布林型別

布林字面值true和false是Boolean型別的成員。

符號字面值

符號常量'x是簡寫的表達scala.Symbol(“X”)。Symbol是一個類,它的定義如下。

package scala
final case class Symbol private (name: String) {
   override def toString: String = "'" + name
}

字元

字元文字是用引號括起來的單個字元。該字元是一個可列印的Unicode字元或轉義序列描述。這裡有一些字元文字:

'a' 
'u0041'
'
'
'         '

字串常量

字串常量是在雙引號中的字元序列。字元或者是可列印Unicode字元或轉義序列描述。下面是一些字串:

"Hello,
World!"
"This string contains a " character."

多行字串

多行字串是包含在三重引號“”字元序列“...”“”。字元序列是任意的,不同之處在於它可以包含三個或更多個連續引號字元僅在未尾。

字元未必是可列印;新的一行或其他控制字元也是允許的。這裡是一個多行字串:

"""the present string
spans three
lines."""

NULL值

null是scala.Null型別一個值,因此這個引用型別相容。它表示參考值是指一種特殊的“空”的物件。

轉義序列:

以下轉義序列在字元和字串。

轉義序列

Unicode

描述

u0008

退格BS

u0009

水平製表符HT

u000c

換頁FF

f

u000c

換頁FF

u000d

回車CR

"

u0022

雙引用 "

'

u0027

單引用 .

\

u005c

反斜線

介於0和255字元使用Unicode也可以通過一個八進位制轉義,也就是說,一個反斜槓“”之後的最多三個八進位制字元的序列表示。以下為例子來說明一些轉義字元序列:

object Test {
   def main(args: Array[String]) {
      println("Hello World
" );
   }
} 

當上述程式碼被編譯和執行時,它產生了以下結果:

Hello   World

變數是隻不過是保留記憶體位置來儲存值。這意味著,當建立一個變數,會在記憶體中保留一些空間。

基於變數的資料型別,所述編譯器分配儲存器,並決定什麼可以被儲存在保留儲存器。因此,通過分配不同的資料型別的變數,可以儲存整數,小數,或字元在這些變數。

變數宣告

Scala的變數宣告有不同的語法,它們可以被定義為值,即,常量或變數。下面是使用var關鍵字來定義一個變數的語法:

var myVar : String = "Foo"

在這裡,myVar使用關鍵字var宣告。這意味著它是一個可以改變值的變數,被稱為可變變數。下面是使用val關鍵字來定義變數的語法:

val myVal : String = "Foo"

這裡,myVal是使用關鍵字val宣告。這意味著,它是不能改變的變數,這是所謂的不可變變數。

變數資料型別:

變數型別在變數名後面指定,前在equals之前簽署。可以通過它的資料型別定義任何型別的Scala變數如下:

val or val VariableName : DataType [=  Initial Value]

如果不指定任何初始值變數,那麼如下所示它是有效的:

var myVar :Int;
val myVal :String;

變數型別推斷:

當分配一個初始值給一個變數,Scala編譯器可以計算出根據分配給它的值的變數型別。這就是所謂的變數型別推斷。因此,可以寫這些變數的宣告如下這樣:

var myVar = 10;
val myVal = "Hello, Scala!";

在這裡,預設情況下,myVar是int型別,將設為myVal為字串型別變數。

多重任務:

Scala支援多工。如果一個程式碼塊或方法返回一個元組,該元組可被分配給一個val變數。 [注:元組在以後的章節中學習。]

val (myVar1: Int, myVar2: String) = Pair(40, "Foo")

型別推斷得到正確型別:

val (myVar1, myVar2) = Pair(40, "Foo")

變數型別:

Scala變數可以有三種不同的範圍,這取決於它們正在使用的地方。它們可以存在於欄位,方法引數和區域性變數。下面是關於每種型別的適用範圍的詳細資訊:

欄位:

欄位是屬於一個物件的變數。該欄位是從物件中的所有方法中訪問。欄位也可以是具體取決於訪問修飾符欄位與宣告的物件外訪問。物件欄位既可以是可變的或不可變的型別,可以使用var 或 val兩種定義。

方法引數:

方法的引數是變數,其用於傳遞方法內的值在方法被呼叫時。方法引數被從方法唯一傳入,但傳遞的物件可從外面,如果從外面的方法有一個引用物件。方法引數始終是可變的並由val關鍵字定義。

區域性變數:

區域性變數是在方法內宣告的變數。區域性變數只能在方法中訪問,但可以訪問建立方法的物件(如果從方法中返回它們)。區域性變數既可以是可變的或不可變的型別,可以使用var或val兩個關鍵字定義。

from: http://www.yiibai.com/scala/scala_basic_syntax.html