2015-08-14 73 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 –