这是我第一次使用Scala。我有一个存储在var中的对象。我将该var发送给一个函数。在函数中我需要更改一些属性。但斯卡拉说,我正在重新分配给瓦尔。
这是我的代码
var bookletInfo = new BookletInfo(
id = Some(0),
name = "",
)
bookletInfo = Convert(bookletInfo)
def Convert(bookletInfo: BookletInfo) = {
bookletInfo.name = "Booklet"
bookletInfo.id = Some(1)
}
我不知道我做错了什么。
答案 0 :(得分:6)
我要猜测并说,因为@Mikesname建议以这样的方式定义BookletInfo,id
和name
是val
,因此是不可变的。您可以将它们更改为vars
,但更好的方法可能是这样的:
case class BookletInfo(id:Option[Int], name:String) //name could also be an option too
var bookletInfo = BookletInfo(None, "")
bookletInfo = convert(bookletInfo)
def convert(bookletInfo: BookletInfo):BookletInfo = {
bookletInfo.copy(id = Some(1), name = "Booklet"
}
这里我们将BookletInfo
保留为不可变类(案例类),并利用copy()
功能从中生成新的BookletInfo
。
使用像Scala这样的函数式语言,您应该尝试围绕不变性进行设计并避免副作用。这样做可以产生更清晰,更确定的代码(更容易测试)。当情况明显受益于它时可以回退到可变性(高性能问题是可能的原因),但从不变性开始。
答案 1 :(得分:3)
Afaik,函数的参数是不可变的,所以如果你传入一个var或一个val它就没关系,因为一个函数paraneter我们把它当作一个val。
尝试创建参数的副本,编辑它然后返回它。这应该可以解决你的问题。
答案 2 :(得分:1)
嗯......所以基本上当你做这样的事情时:
var b: MyObject = new MyObject()
该声明中有三件事 - identifier
,variable
和value
。所以,您知道... variable
类型MyObject
已创建,由identifier
标识,variable
的值为value
,这是一个新的MyObject
mutability
的实例。
现在,variable
的概念适用于value
和vairable
,这意味着mutable
可以immutable
或mutable
独立于"值"是// immutble variable and immutable value
val m1 = scala.collection.immutable.HashMap[ String, String ]()
// mutable variable and immutabe value
var m2 = scala.collection.immutable.HashMap[ String, String ]()
// immutable variable and mutabe value
val m3 = scala.collection.mutable.HashMap[ String, String ]()
// mutable variable and mutabe value
var m4 = scala.collection.mutable.HashMap[ String, String ]()
或不是,反之亦然。
现在你可以拥有,
mutate
正如您已经知道的那样,immutable
(更改)reassign
的某些内容,您无法immutable
(因为变量的值是其赋值)variable
mutable
1}} immutable
同样,你不能value
variable
immutable
。
现在......说到函数......函数参数value
都是value
(它没有说明mutable
)。
所以...基本上当你传递一些immutable
时(无论是variable
还是variable
immutable
引用),{{1}}引用函数内部始终为{{1}}。