gpt4 book ai didi

scala - 为什么我应该避免在 Scala 中使用局部可修改变量?

转载 作者:行者123 更新时间:2023-12-04 13:49:03 24 4
gpt4 key购买 nike

我对 Scala 还很陌生,而且大部分时间我都没有使用过 Java。现在我的代码中到处都是警告,说我应该“避免可变局部变量”,我有一个简单的问题 - 为什么?

假设我有一个小问题 - 从四个中确定最大整数。我的第一种方法是:

def max4(a: Int, b: Int,c: Int, d: Int): Int = {
var subMax1 = a
if (b > a) subMax1 = b

var subMax2 = c
if (d > c) subMax2 = d

if (subMax1 > subMax2) subMax1
else subMax2
}

考虑到此警告消息后,我找到了另一个解决方案:
def max4(a: Int, b: Int,c: Int, d: Int): Int = {
max(max(a, b), max(c, d))
}

def max(a: Int, b: Int): Int = {
if (a > b) a
else b
}

它看起来更漂亮,但这背后的意识形态是什么?

每当我处理一个问题时,我都会这样想:“好吧,我们从这个开始,然后我们逐步改变事情并得到答案”。我知道问题是我尝试 更改 一些初始状态以获得答案并且不明白为什么至少在本地改变事物是不好的?如何在像 Scala 这样的函数式语言中迭代集合?

举个例子:假设我们有一个整数列表,如何编写一个函数来返回能被 6 整除的整数子列表?想不出没有局部可变变量的解决方案。

最佳答案

在您的特定情况下,还有另一种解决方案:

def max4(a: Int, b: Int,c: Int, d: Int): Int = {
val submax1 = if (a > b) a else b
val submax2 = if (c > d) c else d

if (submax1 > submax2) submax1 else submax2
}

跟随不是更容易吗?当然我有点偏见,但我倾向于认为是, 但是 不要盲目地遵循这个规则。如果您发现某些代码可能以可变风格编写得更易读和更简洁,请这样做——scala 的强大之处在于您不需要 promise 既不可变也不可变的方法,您可以在它们之间摇摆(顺便说一句,同样适用于 return 关键字用法)。

Like an example: Suppose we have a list of ints, how to write a function that returns the sublist of ints which are divisible by 6? Can't think of solution without local mutable variable.



当然可以使用递归来编写这样的函数,但同样,如果可变解决方案看起来和运行良好,为什么不呢?

关于scala - 为什么我应该避免在 Scala 中使用局部可修改变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31775936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com