什么是"真实" val b和var b之间的区别?

时间:2018-01-15 06:49:30

标签: scala lambda functional-programming

什么是"真实"以下区别?

val b = ( x:Double) => x * 3
var b = ( x:Double) => x * 3

从技术上讲,一旦将值分配给val,就不应该更改它。但是,作为第一个语句的一部分,b的值可以通过传递x的不同值来更改为不同的值。

scala> val b = ( x:Double) => x * 3                         
b: Double => Double = $$Lambda$1109/411756754@7a522157      

scala> b(3)                                                 
res1: Double = 9.0                                          

scala> b(4)                                                 
res2: Double = 12.0  

这里到底发生了什么?是不是b的价值在这里发生了变化?

3 个答案:

答案 0 :(得分:2)

b是一个函数,它接受Double并返回一个。

函数本身无法更改,而不是它返回的值(函数是一等值)。

如果您尝试这样做:

b = (x : Double) => x * 6

你会得到:

  

错误:重新分配给val

但是可以更改var一个:

scala> b = (x : Double) => x * 7
b: Double => Double = $$Lambda$1308/1272194712@9e46050

但请注意,当您更改var时,应该保留其类型:一个带Double并返回Double的函数,如果要更改任何一个,则相同其他类型,如IntegerBoolean

答案 1 :(得分:0)

在您发布的示例b中是一个函数。您随后将不同的值传递给函数。 b的值不会因此而改变。

语法如下:

enter image description here

答案 2 :(得分:0)

在scala中,'val'是一个不可变的,它具有只读的属性,这就是为什么它只打印值'9'但在第二个语句中现在'b'被声明为'var',这使我们能够读取和放大;写入值,使其打印值'12'。

Scala允许用户决定变量是不可变还是可变。不可变是只读,其中可变是读写。使用关键字“val”声明不可变变量。

scala> val age:Int=22

此处的年龄已在声明期间初始化为一个值。由于它已被声明为val,因此不能将age重新分配给新值。任何尝试都会导致重新分配给val错误。

可变变量与关键字“var”相关联。与val不同,“var”可以重新分配给不同的值或指向不同的对象。但是他们必须在申报时初始化。

scala> var age:Int=22
age: Int=22

scala> age=35
age: Int=35