返回void随着越来越多的困惑提了起来,我甚至发现,我无法理解Scala的简单函数的定义:如何定义一个函数不返回或斯卡拉
如果我只是想定义一个函数什么都不做,但一些无用此外,我怎么能是这样做的:
def nothing(a:Int, b:Int) = {
a = a+1; b=b+1;
}
我想要的是加1,A和b返回任何结果或无效。
我有点觉得我学到的越多,我开始越不熟悉,即使对于我以前学过的东西,这也太可怕了。
返回void随着越来越多的困惑提了起来,我甚至发现,我无法理解Scala的简单函数的定义:如何定义一个函数不返回或斯卡拉
如果我只是想定义一个函数什么都不做,但一些无用此外,我怎么能是这样做的:
def nothing(a:Int, b:Int) = {
a = a+1; b=b+1;
}
我想要的是加1,A和b返回任何结果或无效。
我有点觉得我学到的越多,我开始越不熟悉,即使对于我以前学过的东西,这也太可怕了。
你的问题可以归结为两个部分:
1)如何定义函数返回什么?很简单,只是对其进行编码,输入签名,单位是中阶的方式来表达无效(他们实际上是相同的,Java函数返回void将在世界上阶返回单位):
scala> def foo(x: Int): Unit = x * x
foo: (x: Int)Unit
scala> foo(1)
scala>
此前斯卡拉鼓励这样所谓程序定义(见,没有等号):
scala> def foo(x: Int) { x * x }
foo: (x: Int)Unit
scala> foo(2)
scala>
但它是很容易出错,因此灰心。
2)如何修改传入函数的基元?你不能,斯卡拉,以及Java不允许这一点,这是一个伟大的好事。
正如Chris和om-nom所说的,你不能改变作为参数传递给函数的原语,并且需要声明新的vals。此外,您还可以将参数后指定通过附加: Unit
您的变量的返回类型(或任何有效的类型),在签名,如下:
def nothing(a:Int, b:Int): Unit = { val new_a = a+1; val new_b = b+1 }
注意你的函数的隐式类型已经Unit
,即在scala中无效。
如果您刚从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)
}
它并没有改变很多,但[@Kuan声明Java和Javascript作为它们的背景](http:// stackoverflow。 com/q/31998382/298389) –
@WilsondeCarvalho感谢您添加函数式编程的额外信息,这对我理解为什么无法修改参数很有帮助。 – Kuan
@Kuan,这本书在我五年前首次在Scala开始时帮助了我很多:http://www.scala-lang.org/docu/files/ScalaByExample.pdf –
你不能重新分配方法的参数。但是你可以声明新的vals:'val a_ = a + 1; val b_ = b + 1' –
@ChrisMartin谢谢,所以你的意思是我必须定义两个变量来复制参数并添加?你能告诉我怎样才能返回无效? – Kuan