Spark記錄-Scala變量/訪問修飾符/運算符


變量是保存存儲值的內存位置的名稱。這意味着當創建變量時,可以在內存中保留一些空間。

根據變量的數據類型,編譯器分配內存並決定可以存儲在預留內存中的內容。因此,通過為變量分配不同的數據類型,可以在這些變量中存儲整數,小數或字符。

變量聲明

Scala具有用於聲明變量的不同語法。它們可以被定義為值,即常數或變量。 這里,myVar使用關鍵字var聲明。 它是一個可以改變值的變量,這稱為可變變量。 以下是使用var關鍵字定義變量的語法 -

語法

var myVar : String = "Foo" 
Scala

下面示例中,myVal使用關鍵字val聲明。它是一個不能被改變的變量,這被稱為不可變變量。 以下是使用val關鍵字定義變量的語法 -

val myVal : String = "Foo" 
Scala

可變數據類型

變量的類型在變量名稱和等號之前指定。可以通過其數據類型來定義任何類型的Scala變量,如下所示:

val or val VariableName : DataType = [Initial Value] 
Scala

如果您沒有為變量分配任何初始值,則有效的語法如下:

var myVar :Int; val myVal :String; 
Scala

可變類型推斷

當為變量分配初始值時,Scala編譯器可以根據分配給它的值來推斷變量的類型。這被稱為變量類型推斷。 因此,可以編寫這樣的變量聲明 -

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

默認情況下,myVar將會被計算推斷為Int類型,myVal將計算推斷為String類型變量。

多個賦值

Scala支持多個賦值。如果代碼塊或方法返回一個元組(Tuple - 保持不同類型的對象的集合),則可以將元組分配給一個val變量。

注:我們將在隨后的章節學習元組。

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

類型推斷得到正確的類型 -

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

示例程序

以下是一個示例程序,用於說明Scala中變量聲明的過程。該程序聲明了四個變量 - 兩個變量用變量聲明定義,其余兩個變量沒有變量聲明。

例子

object Demo { def main(args: Array[String]) { var myVar :Int = 10; val myVal :String = "Hello Scala with datatype declaration."; var myVar1 = 20; val myVal1 = "Hello Scala new without datatype declaration."; println(myVar); println(myVal); println(myVar1); println(myVal1); } } 
Scala

將上述程序保存在源文件:Demo.scala中,使用以下命令用於編譯和執行此程序。

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
10
Hello Scala with datatype declaration.
20
Hello Scala new without datatype declaration.

D:\software\scala-2.12.3\bin>
Shell

變量的作用域

Scala中的變量可以有三個不同的范圍,具體取決於它們被使用的位置。它們可以作為字段存在,作為方法參數和局部變量存在。以下是每種類型范圍的詳細信息。

字段

字段是屬於對象的變量。這些字段可以從對象中的每個方法的內部訪問。根據字段聲明的訪問修飾符,也可以在對象外部訪問字段。 對象字段可以是可變的和不可變的類型,可以使用varval來定義。

方法參數

方法參數是在調用該方法時用於傳遞方法中的值的變量。方法參數只能從方法內部訪問,但是如果從方法外部引用了對象,則可以從外部訪問傳入的對象。方法參數始終是不可變的,由val關鍵字定義。

局部變量

局部變量是在方法中聲明的變量。局部變量只能從方法內部訪問,但如果從方法返回,則您創建的對象可能會轉義該方法。局部變量可以是可變的和不可變的類型,可以使用varval定義。

包,類或對象的成員可以使用私有(private)和受保護(protected)的訪問修飾符進行標注,如果不使用這兩個關鍵字的其中一個,那么訪問將被視為公開(public)的。這些修飾符限制了對某些代碼區域的成員訪問。

1.算術運算符

下表顯示了Scala支持的所有算術運算符。假設變量A的值是10,變量B的值是20,那么 -

運算符 描述 示例
+ 將兩個操作數相加 A + B = 30
- 從第一個操作數減去第二個操作數 A − B = -10
* 將兩個操作數相乘 A * B = 200
/ 將第一個操作數除以第二個操作數  
% 模數運算符和整數除法后的余數。 B % A = 0
++ 遞增運算符將整數值增加1 A++ = 11
-- 遞減運算符將整數值減1。 A-- = 9
object Demo { def main(args: Array[String]) { var a = 10; var b = 20; var c = 25; var d = 25; println("a + b = " + (a + b) ); println("a - b = " + (a - b) ); println("a * b = " + (a * b) ); println("b / a = " + (b / a) ); println("b % a = " + (b % a) ); println("c % a = " + (c % a) ); } }

2.關系運算符

下表顯示了Scala語言支持的關系運算符。假設變量A=10,變量B=20,則 -

運算符 描述 示例
== 檢查兩個操作數的值是否相等。 如果相等,則條件成立。 (A == B)結果為false
!= 檢查兩個操作數的值是否相等。 如果值不相等,則條件成立。 (A != B) 結果為true
> 檢查左操作數的值是否大於右操作數的值。 如果是,則條件成立。 (A > B) 結果為false
< 檢查左操作數的值是否小於右操作數的值。 如果是,則條件成立。 (A < B)結果為true
>= 檢查左操作數的值是否大於等於右操作數的值。 如果是,則條件成立。 (A >= B) 結果為false
<= 檢查左操作數的值是否小於等於右操作數的值。 如果是,則條件成立。 (A <= B)結果為true
object Demo { def main(args: Array[String]) { var a = 10; var b = 20; println("a == b = " + (a == b) ); println("a != b = " + (a != b) ); println("a > b = " + (a > b) ); println("a < b = " + (a < b) ); println("b >= a = " + (b >= a) ); println("b <= a = " + (b <= a) ); } }

3.邏輯運算符

下表顯示了Scala支持的所有邏輯運算符。 假設變量A=1,變量B=0,則 -

運算符 描述 示例
&& 邏輯與運算符。 如果兩個操作數都不為零,則條件成立。 (A && B)結果為false
稱為邏輯或運算符。如果兩個操作數中的任何一個非零,則條件成立。 (AB)結果為true
! 稱為邏輯非運算符,它用於反轉其操作數的邏輯狀態。如果條件為真,則邏輯NOT運算符將使其結果為false
object Demo { def main(args: Array[String]) { var a = true; var b = false; println("a && b = " + (a&&b) ); println("a || b = " + (a||b) ); println("!(a && b) = " + !(a && b) ); } }

4.按位運算符

按位運算符對位進行操作,並執行逐位運算。 |^的真值表如下 -

p q p & q p/q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

下表列出了Scala支持的按位運算符。假設變量A=60,變量B=13,則 -

運算符 描述 示例
& 如果二進制AND運算符存在於兩個操作數中,則二進制AND運算符將對結果復制一位。 (A&B)= 12,即0000 1100
二進制OR運算符如果存在於任一操作數中,則復制一位。 (AB) = 61, 即 0011 1101
^ 二進制XOR操作符復制該位,如果它設置在一個操作數中,而不是兩者。 (A ^ B) = 49, 即, 0011 0001
~ 二進制補碼運算符是一元的,具有“翻轉”位的作用。 (~A)= -61,即 1100 0011的補碼形式。
<< 二進制左移操作符,左操作數值左移由右操作數指定的位數。 A << 2 = 240 即, 1111 0000
>> 二進制右移操作符,左操作數值被右操作數指定的位移動。 A >> 2 = 15 即,0000 1111

5.賦值運算符

下表列出了Scala語言支持的賦值運算符 -

運算符 描述 示例
= 簡單賦值運算符,將右側操作數的值分配給左側操作數 C = A + B,將A + B的值分配給C
+= 相加與賦值運算符。它將右操作數添加到左操作數,並將結果分配給左操作數。 C + = A等價於C = C + A
-= 相減與賦值運算符。它從左操作數中減去右操作數,並將結果分配給左操作數。 C -= A等價於 C = C - A
*= 乘以與賦值運算符。它將右操作數與左操作數相乘,並將結果分配給左操作數。 C * = A等價於C = C * A
/= 除以與賦值運算符。它將左操作數與右操作數分開,並將結果分配給左操作數。 C /= A等價於C = C / A
%= 模數與賦值運算符。它需要使用兩個操作數的模數,並將結果分配給左操作數。 C %= A等價於C = C % A
<<= 左移與賦值運算符 C <<= 2等價於C = C << 2
>>= 右移與賦值運算符 C >> = 2等價於C = C >> 2
&= 按位與賦值運算符 C &= 2等價於C = C & 2
^= 按位異或運算符和賦值運算符。 C ^= 2等價於C = C ^ 2
按位包含OR和賦值運算符。

6.運算符優先級

運算符優先級決定表達式中術語的分組,並決定如何評估計算表達式。 某些運算符的優先級高於其他運營商; 例如,乘法運算符的優先級高於加法運算符,則先要執行乘法運算符的運算。

讓我們通過下面的例子了解優先級:

int value = 10 + 20 * 10; 
C

value變量計算結果為:210,因為*(乘法運算符)的優先級比+(加法運算符)高,所以在+(加法運算符)之前進行求值。

C語言運算符的優先級和關聯性如下:

分類 運算符 關聯性
后綴 () [] -> . ++ - - 左到右
一元 + - ! ~ ++ - - (type)* & sizeof 右到左
乘法 * / % 左到右
加法 + - 左到右
位移 << >> 左到右
關系 < <= > >= 左到右
等於 == != 左到右
按位與 & 左到右
位異或 ^ 左到右
按位或 / 左到右
邏輯與 && 左到右
邏輯或 // 左到右
條件 ?: 右到左
賦值 = += -= *= /= %=>>= <<= &= ^= /= 右到左
逗號 , 左到右


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM