我已经知道在编写代码和减少错误方面,不可变性比可变性更有优势,特别是在多线程代码中。但是,在创建结构体时,我无法看到创建完全不可变的结构体相比创建可变结构体的任何优势。
让我们以一个保持一些分数的结构体作为例子:
在这个结构中,我可以更改现有结构变量上的分数值。
不可变版本应该是这样的:
我不明白第二种方法比第一种方法的好处在哪里,因为结构体是值类型。如果我传递一个结构体,它总是会被复制。所以对我来说似乎没有关系这个结构体是否有一个可变属性,因为代码的其他部分会在另一个副本上工作,从而消除了可变性的问题。
虽然我看到一些人使用第二个例子,但它需要更多的代码,而没有明显的好处。我是否有所忽略?
让我们以一个保持一些分数的结构体作为例子:
struct ScoreKeeper {
var score: Int
}
在这个结构中,我可以更改现有结构变量上的分数值。
var scoreKeeper = ScoreKeeper(score: 0)
scoreKeeper.score += 5
println(scoreKeeper.score)
// prints 5
不可变版本应该是这样的:
struct ScoreKeeper {
let score: Int
func incrementScoreBy(points: Int) -> ScoreKeeper {
return ScoreKeeper(score: self.score + points)
}
}
它的用法:
let scoreKeeper = ScoreKeeper(score: 0)
let newScoreKeeper = scoreKeeper.incrementScoreBy(5)
println(newScoreKeeper.score)
// prints 5
我不明白第二种方法比第一种方法的好处在哪里,因为结构体是值类型。如果我传递一个结构体,它总是会被复制。所以对我来说似乎没有关系这个结构体是否有一个可变属性,因为代码的其他部分会在另一个副本上工作,从而消除了可变性的问题。
虽然我看到一些人使用第二个例子,但它需要更多的代码,而没有明显的好处。我是否有所忽略?