簡談scala 中的val 與 var

2021-07-13 12:04:48 字數 1159 閱讀 7690

斷斷續續學習scala也有一段時間了,初期總對val 與var 的理解不太透徹,今天來做做總結。

一般都知道val 表示不可變,var表示可變,比如:

val s ="hello"

s="world"//錯誤,不能對val重新賦值

var i=1

i=2//沒有問題

但是在碰到可變與不可變資料結構的時候,容易造成迷惑:

val numbers= arraybuffer(1,2,3)

numbers+=5

//success

var numbers=set(1,2,3)

numbers+=5

//success

咋一看val不是不可變的嗎,怎麼能numbers+=5?

val numbers指向了乙個可變的資料結構 陣列緩衝arraybuffer ,numbers是可以進行

numbers+=5操作的, 這是因為所指的這個物件是有自己的狀態的,比如這裡的物件是arraybuffer型別,這個的物件的狀態是可以改變的,但是你不能val numbers =arraybuffer(1,2)了,被val宣告的numbers只能指向這個物件,但是這個物件自身的狀態是可以改變的(因為是型別是陣列緩衝)

再看下乙個:

set是乙個不可變物件,被宣告為var的numbers指向,numbers+=的意義是什麼呢?它返回乙個新的物件set(1,2,3,5)原來的set(1,2,3)你無法改變,因為他是乙個不可變的物件,這個新的set再重新被指向了numbers. 要明白,可變物件陣列緩衝的方法「+=」返回的是修改後的原來的集合,而不可變物件set的「+=」返回的是乙個新的集合。

為了證明物件自身是有狀態的,再看一下stackoverflow上面的例子:

class

a(n: int)

class

b(n: int)

object

test

}

可以看到 x 與x.value都不能被重新賦值,以為他們都被val宣告,一旦指向乙個物件就不能再被指向其他的物件了, 但是這個物件自身的狀態是會改變的,例如x.value.value就能被重新賦值了。

簡談python中的 call

最近在思考 call 和類方法的使用場景,雖然功能會有重疊,但凡存在的必是合理的,肯定會有輕微的不同,看了django以及部分框架的設計原始碼,各有各的設計風格,本著功能邊界的看法,所以做個總結。classa def init self,a,b self.a a self.b b defdo sta...

1 簡談語音識別中的WFTS

用wfst來表徵asr中的模型 hclg 可以更方便的對這些模型進行融合和優化,於是可以作為乙個簡單而靈活的asr的解碼器 and flexible asr decoder design 利用wfts,我們可以吧ctc label,lexicon 字典 language models 語言模型 等模...

簡談Python中的 new 和 init

今天想跟大家談談有關python中的 new 和 init 的問題,其實這個問題對於我來說還是比較難的,想要徹底弄明白這兩個的區別的確不是一件容易的事情。下面就是我自己的一些簡單的看法。首先我們要明白一點的是,只有繼承於object的類,或者更準確的說,祖先類是object類才有 new 方法,其他...