我在函数中发送一个变量作为var,但我收到它作为val

时间:2015-03-01 13:36:03

标签: scala

这是我第一次使用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)
}

我不知道我做错了什么。

3 个答案:

答案 0 :(得分:6)

我要猜测并说,因为@Mikesname建议以这样的方式定义BookletInfo,idnameval,因此是不可变的。您可以将它们更改为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()

该声明中有三件事 - identifiervariablevalue。所以,您知道... variable类型MyObject已创建,由identifier标识,variable的值为value,这是一个新的MyObject mutability的实例。

现在,variable的概念适用于valuevairable,这意味着mutable可以immutablemutable独立于"值"是// 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}}。