假设我有一些可重用的方法(在现实生活中更复杂),它接受3个BigDecimal参数并计算一些内容。计算后,输入参数在内部发生变化,我需要所有三个参数都在外部进行下一次计算,等等。
如果它只是一个参数,我就可以将它作为返回值返回。
在Scala中做这件事的惯用方法是什么?
object MutableTest extends App {
def mutableMethodWithComplicatedButReusableLogic(a: BigDecimal, b: BigDecimal, c: BigDecimal) = {
a = b + c
c = b * a
b = 0
//All three of changed args should be available outside
}
var a: BigDecimal = 10
var b: BigDecimal = 11
var c: BigDecimal = 12
//1. step
mutableMethodWithComplicatedButReusableLogic(a, b, c)
//2. step a, b, c should change in step 1 and
mutableMethodWithComplicatedButReusableLogic(a*b, b, c -1)
....
}当然,这样的结果是:编译时错误:(9,7)重新分配给val =b+c
全局变量是应答的,还是某个可变的助手持卡器对象?
发布于 2016-12-30 09:20:17
我不会修改它们,只需在一个三重态或一个案例类实例中返回计算结果:
def mutableMethodWithComplicatedButReusableLogic(
a: BigDecimal, b: BigDecimal, c: BigDecimal
): (BigDecimal, BigDecimal, BigDecimal) = {
val newA = ... //Compute a
val newB = ... //Compute b
val newC = ... //Compute c
(newA, newB, newC) // Or whatever other cmputation
}发布于 2016-12-30 09:20:57
您可以使用元组返回多个值,或者使用包装a、b和c的包装器case类。
def mutableMethodWithComplicatedButReusableLogic(a: BigDecimal, b: BigDecimal, c: BigDecimal): (BigDecimal, BigDecimal, BigDecimal) = {
(b + c, 0, b * (b + c))
}用法:
val (a, b, c) = mutableMethodWithComplicatedButReusableLogic(1, 2, 3)使用case类(即用case类包装这个三元组并提供很好的名称,这是推荐的方法,因为它可以提高代码的可维护性)
case class Wrapper (val a: BigDecimal, val b: BigDecimal, val c: BigDecimal)
def mutableMethodWithComplicatedButReusableLogic(wrapper: Wrapper): Wrapper = {
Wrapper((wrapper.b + wrapper.c, 0, wrapper.b * (wrapper.b + wraper.c)))
}用法:
val Wrapper(a, b, c) = mutableMethodWithComplicatedButReusableLogic(Wrapper(1, 2, 3))一般建议
尽量避免使用突变。不可变,当你的软件成长时,这是没有bug的唯一方法。此外,函数变得可测试,重构也很容易。代码变得声明性和易读性。使用返回类型从函数与外部世界进行通信。为返回类型类提供有意义的名称,而不是使用简单的元组。
只有当状态可以提高整体性能时,才使用状态。始终在容器中包含状态,不允许其他外部实体操作状态。
这样你生活中的问题就少了,你可以早点回家。
https://stackoverflow.com/questions/41393564
复制相似问题