返回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