首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala -指向对象的指针的多个可变参数引用或逐引用

问Scala -指向对象的指针的多个可变参数引用或逐引用
EN

Stack Overflow用户
提问于 2016-12-30 09:13:09
回答 2查看 775关注 0票数 1

假设我有一些可重用的方法(在现实生活中更复杂),它接受3个BigDecimal参数并计算一些内容。计算后,输入参数在内部发生变化,我需要所有三个参数都在外部进行下一次计算,等等。

如果它只是一个参数,我就可以将它作为返回值返回。

在Scala中做这件事的惯用方法是什么?

代码语言:javascript
复制
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

全局变量是应答的,还是某个可变的助手持卡器对象?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-30 09:20:17

我不会修改它们,只需在一个三重态或一个案例类实例中返回计算结果:

代码语言:javascript
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2016-12-30 09:20:57

您可以使用元组返回多个值,或者使用包装a、b和c的包装器case类。

代码语言:javascript
复制
def mutableMethodWithComplicatedButReusableLogic(a: BigDecimal, b: BigDecimal, c: BigDecimal): (BigDecimal, BigDecimal, BigDecimal) = {
 (b + c, 0, b * (b + c))
}

用法:

代码语言:javascript
复制
val (a, b, c) = mutableMethodWithComplicatedButReusableLogic(1, 2, 3)

使用case类(即用case类包装这个三元组并提供很好的名称,这是推荐的方法,因为它可以提高代码的可维护性)

代码语言:javascript
复制
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)))
}

用法:

代码语言:javascript
复制
val Wrapper(a, b, c) = mutableMethodWithComplicatedButReusableLogic(Wrapper(1, 2, 3))

一般建议

尽量避免使用突变。不可变,当你的软件成长时,这是没有bug的唯一方法。此外,函数变得可测试,重构也很容易。代码变得声明性和易读性。使用返回类型从函数与外部世界进行通信。为返回类型类提供有意义的名称,而不是使用简单的元组。

只有当状态可以提高整体性能时,才使用状态。始终在容器中包含状态,不允许其他外部实体操作状态。

这样你生活中的问题就少了,你可以早点回家。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41393564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档