【问题标题】:how do I increment an integer variable I passed into a function in Scala?如何增加传递给Scala函数的整数变量?
【发布时间】:2013-03-20 07:01:31
【问题描述】:

我在函数外部声明了一个变量,如下所示:

var s: Int = 0

通过它是这样的:

def function(s: Int): Boolean={

   s += 1

   return true

}

但在我的一生中,“s +=”下的错误行不会消失。我什么都试过了。顺便说一句,我是 Scala 新手。

【问题讨论】:

  • 为什么要增加函数中的值?只需返回新值。您正在重新分配您传入的值。
  • 我正在用价值做其他事情。这只是我的问题的一个小例子。
  • 你不能这样做,你真的在​​调用s = s + 1,所以你只是将你的本地指针重新分配给一个新变量。
  • @JL 在这种特殊情况中你所能做的就是将 int 包装到 MutableInt 容器中,该容器具有操作增量,然后将其传递给函数并调用该方法。您可能会认为这是一个很大的开销,而且确实如此:您直接违背了语言概念。

标签: scala parameter-passing immutability


【解决方案1】:

首先,我要重复我的警告:下面的解决方案既晦涩又低效,如果可能的话,请尝试使用values。

implicit class MutableInt(var value: Int) {
  def inc() = { value+=1 } 
}

def function(s: MutableInt): Boolean={
   s.inc() // parentheses here to denote that method has side effects
   return true
}

下面是实际代码:

scala> val x: MutableInt = 0 
x: MutableInt = MutableInt@44e70ff

scala> function(x)
res0: Boolean = true

scala> x.value
res1: Int = 1

【讨论】:

  • @JL 我希望你不会认真地将这个“解决方案”用于任何事情,我认为这不是 om-nom-nom 的意图。
【解决方案2】:

如果你只想不断增加整数,你可以使用 Stream。

val numberStream = Stream.iterate(0)(_ + 1).iterator

这会在一个从零开始的永无止境的数字流上创建一个迭代器。然后,要获取下一个号码,请致电

val number: Int = numberStream.next

【讨论】:

    【解决方案3】:

    我也刚刚开始使用 Scala,这是我的工作。

    var s: Int = 0
    

    def function(s: Int): Boolean={
    
       var newS = s
       newS = newS + 1 
       s = newS
       return true
    
    }
    

    从我读到的内容中,您没有将相同的“s”传递到您的函数中,因为在其余代码中。我相信有更好的方法,但这对我有用。

    【讨论】:

      【解决方案4】:

      你没有。

      var 是一个引用可能会更改的引用的名称。当你调用一个函数时,你传递了引用本身,一个新的名字就会绑定到它上面。

      因此,要更改名称指向的引用,您需要引用包含该名称的任何内容。如果它是一个对象,那就很容易了。如果是局部变量,那就不可能了。

      另请参阅 call by reference,虽然我不认为这个问题是真正的重复。

      【讨论】:

        【解决方案5】:

        如果你只想增加一个以 3 开头的变量

        val nextId = { var i = 3; () => { i += 1;我}}

        然后调用它:

        nextId()

        【讨论】:

        • 这实际上并没有解决这个问题(4 年前提出并回答了这个问题)。
        猜你喜欢
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 2011-06-21
        • 2014-05-11
        • 2020-07-28
        相关资源
        最近更新 更多