在以下兩種方式中,我無法execute在 ** sum 函式中或 **? 按鈕不可點擊。intelleiJ請幫助我找出兩者中的錯誤。
object Main{
def sum1(xs : List[Int]): Int = {
xs.filter(_ > 0).sum // am i missing return word here ?
}
def sum2(xs: List[Int]): Unit = {
val mx = xs.filter(_ > 0).sum // is it ok to have return in a variable ?
println(mx)
}
Main.sum1(List(1,2))
Main.sum2(List(1,2,3,4))
}
uj5u.com熱心網友回復:
對于 Intellij,除非您從Scala Worksheet可以在沒有入口點的情況下執行代碼的地方撰寫代碼,否則在任何普通應用程式中,您都需要應用程式的入口點。
在 Scala 2 中,您可以通過兩種方式做到這一點。main在定義中自己定義方法object,這是常規方式:
object Main {
def main(args: Array[String]): Unit = {
// code here
}
}
或者 - 讓您的object定義擴展為您App提供main方法的特征,因此您可以直接在內部開始撰寫代碼:
object Main extends App {
// code here
}
這更干凈一些,并且嵌套的級別更少。
在 Scala 中,陳述句稱為運算式,因為如果最后一個運算式不是賦值,它們通常回傳最后一個運算式的值。這段代碼:
def sum1(xs: List[Int]): Int =
xs.filter(_ > 0).sum
是一個語法糖:
def sum1(xs: List[Int]): Int = {
return xs.filter(_ > 0).sum
}
因為如果代碼只有 1 個運算式,大括號是可選的,并且默認回傳最后一個運算式的值。因此,即使您可以兩種方式撰寫代碼,您也會收到警告Return keyword is redundant,因為您永遠不需要顯式使用它。
此外,您不需要Main.sum1(...)從內部撰寫Main. 您可以省略物件:
object Main extends App {
def sum1(xs: List[Int]): Int =
xs.filter(_ > 0).sum
def sum2(xs: List[Int]): Unit = {
val mx = xs.filter(_ > 0).sum
println(mx) // 10
}
println(sum1(List(1, 2))) // 3
sum2(List(1, 2, 3, 4))
}
對于 Scala 3,事情變得更簡單了。推薦的方法是使用注解對方法進行@main注解,以將其標記為程式中的入口點。這個方法既可以在頂層定義,也可以在定義內部object定義,它的名稱不再重要:
@main def hello() =
// code here
雖然 Scala 3 仍然支持AppScala 2 的 trait,但它現在已被棄用,并且其功能受到限制,因此如果您的程式需要在 Scala 2 和 Scala 3 版本之間交叉構建,建議堅持使用基本方法使用引數在定義中顯式定義main方法:objectArray[String]
object MyMain:
def main(args: Array[String]) =
// code here
注意,花括號在 Scala 3 中成為可選的,有利于更簡潔的 Python 風格的縮進。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/504777.html
標籤:斯卡拉
