2015-08-14 76 views
1

返回void随着越来越多的困惑提了起来,我甚至发现,我无法理解Scala的简单函数的定义:如何定义一个函数不返回或斯卡拉

如果我只是想定义一个函数什么都不做,但一些无用此外,我怎么能是这样做的:

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

我想要的是加1,A和b返回任何结果或无效。

我有点觉得我学到的越多,我开始越不熟悉,即使对于我以前学过的东西,这也太可怕了。

+0

你不能重新分配方法的参数。但是你可以声明新的vals:'val a_ = a + 1; val b_ = b + 1' –

+0

@ChrisMartin谢谢,所以你的意思是我必须定义两个变量来复制参数并添加?你能告诉我怎样才能返回无效? – Kuan

回答

8

你的问题可以归结为两个部分:

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不允许这一点,这是一个伟大的好事。

+0

谢谢,我想知道为什么它不起作用,一旦我添加一个if else块像:def max(a:Int,b:Int):Unit = {if(a> b){val a_ = a + 1} else { val b_ = b + 1}} – Kuan

+0

@Kuan这是什么意思?你创建一个你不使用的名为'a_'或'b_'的本地'val'。既然你没有用这个本地'val'做任何事情,那么做这样的事情就没有用。 – Jesper

+0

@Jesper谢谢你的提问。这只是为了学习目的了解scala的用法/概念。 – Kuan

2

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

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

注意你的函数的隐式类型已经Unit,即在scala中无效。

+0

谢谢,我想知道为什么它不起作用,一旦我添加一个if else块,如:def max(a:Int,b:Int):Unit = {if(a> b){val a_ = a + 1} else { val b_ = b + 1}} – Kuan

+3

@Bacon结尾的变量名称是_ _是地雷,并且Kuan踩了它。请不要这样做。 –

+0

这是正确的让我修改 – Bacon

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) 
} 
+0

它并没有改变很多,但[@Kuan声明Java和Javascript作为它们的背景](http:// stackoverflow。 com/q/31998382/298389) –

+0

@WilsondeCarvalho感谢您添加函数式编程的额外信息,这对我理解为什么无法修改参数很有帮助。 – Kuan

+1

@Kuan,这本书在我五年前首次在Scala开始时帮助了我很多:http://www.scala-lang.org/docu/files/ScalaByExample.pdf –