如何定义函数不会在scala中返回或返回void

时间:2015-08-14 20:35:23

标签: scala

随着越来越多的困惑,我甚至发现我无法理解Scala中的简单函数定义:

如果我只想定义一个除了一些无用的添加之外什么都不做的功能,我该怎么做呢:

def nothing(a:Int, b:Int) = {
    a = a+1; b=b+1;
}

我想要的是在a和b中添加1并且不返回任何内容或无效。

我觉得我学到的越多,我越不熟悉,即使对于我以前学过的人,这也很糟糕。

3 个答案:

答案 0 :(得分:12)

您的问题归结为两部分:

1)如何定义什么都不返回的函数?非常简单,只需将其编码为类型签名,Unit就是说空的scala方式(它们实际上是相同的,返回void的java函数将在scala世界中返回Unit):

scala> def foo(x: Int): Unit = x * x
foo: (x: Int)Unit

scala> foo(1)

scala> 

以前scala鼓励所谓的过程定义(参见,没有等号):

scala> def foo(x: Int) { x * x }
foo: (x: Int)Unit

scala> foo(2)

scala> 

但它很容易出错,因此气馁。

2)如何更改传递给函数的原语?你不能,scala,以及Java不允许这样做,它可以带来很大的好处。

答案 1 :(得分:2)

正如Chris和om-nom所说,你不能改变作为参数传递给函数的原语,并且需要声明新的val。此外,您可以通过在签名中的参数之后附加: Unit(或任何有效类型)来指定变量的返回类型,如下所示:

 def nothing(a:Int, b:Int): Unit = { val new_a = a+1; val new_b = b+1 }

请注意,函数的隐式类型已经是Unit,即scala中的void。

答案 2 :(得分:1)

如果您刚刚来自C ++,则Unit是您要查找的关键字。它与函数返回完全一样无效。

在我看来,这里的问题是仍然不了解函数式编程。无法更改传递参数的值:

def nothing(a:Int, b:Int) = {
    a = a+1; b=b+1; // this won't work
}

相反,您应该使用结果操作返回新值。在这种情况下,您应该将1加到a和b并使用Tuple2返回两者。您可以使用以下sintaxes执行此操作:

def nothing(a:Int, b:Int) = {
    (a + 1, b + 1)
}

def nothing(a:Int, b:Int) = {
    Tuple2(a + 1, b + 1)
}

def nothing(a:Int, b:Int) = {
    Tuple2[Int, Int](a + 1, b + 1)
}