在 Scala 中,至少有兩種語法形式用于使用 定義函數。最大的區別是:是希望 (a) 讓返回類型為"隱式",這意味著您不顯示它,編譯器推斷它- 還是 (b) 顯式定義函數的返回類型
val add1 = (i: Int) => i + 1 // implicit return type (IRT)
val add1: Int => Int = (i) => i + 1 // explicit return type (ERT)
函數體可以用{}
val add1 = (i: Int) => { i + 1 }
val add1: Int => Int = (i) => { i + 1 }
使用ERT語法時,如果只有一個參數,可以不要()
val add1: Int => Int = (i) => { i + 1 }
val add1: Int => Int = i => { i + 1 } // parentheses not required
兩個參數
val sum = (a: Int, b: Int) => a + b // implicit
val sum: (Int, Int) => Int = (a, b) => a + b // explicit
在任何聲明其輸入和輸出類型的編程語言中,都需要聲明所有這些內容;這只是你如何聲明它們的問題,使每種方法不同。例如,當您查看 Scala 的方法語法時,您會看到它需要完全相同的字段,它們只是排序不同,具有不同的字段分隔符符號:
def sum(a: Int, b: Int): Int = a + b
scala菜鳥教程?
第一個塊聲明函數的輸入和返回類型
第二個塊聲明函數的參數名稱和實現算法
此塊的一個關鍵點是,它顯示了輸入參數名稱在算法中的使用方式;參數名稱靠近函數體是有意義的。
函數的第一個塊中的符號顯示它將兩個輸入值轉換為返回值:
第二個shows how the function transforms its input parameter names with its algorithm:=>
以下函數確定輸入參數是偶數還是奇數。它返回一個值,但由于您和 Scala 編譯器都可以通過查看函數體來推斷返回類型,因此我不顯式聲明它:isEvenIntBoolean
val isEven = (i: Int) => i % 2 == 0
與前面的示例一樣,您可以在簽名中看到"通用轉換"符號將輸入值轉換為輸出值:
此 IRT 語法比 ERT 語法更簡潔,并且類似于方法簽名。def
scala> val isEven = (i: Int) => i % 2 == 0
isEven: Int => Boolean = <function1>scala> val isEven = (i: Int) => return i % 2 == 0
<console>:23: error: return outside method definitionval isEven = (i: Int) => return i % 2 == 0^
val isEven = (i: Int) => i % 2 == 0
是下面這種寫法的簡寫
val isEven = (i: Int) => if (i % 2 == 0) true else false
scala一般做什么開發。下面這樣或許更易讀
val isEven = (i: Int) => {if (i % 2 == 0) {true} else {false}
}
IRT形式的多種寫法
val isEven = (i: Int) => { if (i % 2 == 0) true else false }
val isEven = (i: Int) => if (i % 2 == 0) true else falseval isEven = (i: Int) => { i % 2 == 0 }
val isEven = (i: Int) => i % 2 == 0
val isEven = i: Int => i % 2 == 0
ERT時的多種寫法
val isEven: (Int) => Int = (i) => { if (i % 2 == 0) true else false }
val isEven: (Int) => Int = i => { if (i % 2 == 0) true else false }val isEven: (Int) => Int = (i) => { i % 2 == 0 }
val isEven: (Int) => Int = i => { i % 2 == 0 }val isEven: (Int) => Int = (i) => i % 2 == 0
val isEven: (Int) => Int = i => i % 2 == 0val isEven: (Int) => Int = (i) => {if (i % 2 == 0) {true} else {false}
}
有趣的是,無論我使用 ERT 還是 IRT 語法,REPL 都顯示相同的函數簽名
// ERT
scala> val sum: (Int, Int) => Int = (a, b) => a + b
sum: (Int, Int) => Int = <function2>// IRT
scala> val sum = (a: Int, b: Int) => a + b
sum: (Int, Int) => Int = <function2>
但我真正喜歡的 REPL 輸出是它顯示了 ERT 函數語法。請注意我所寫的 ERT 語法與 REPL 響應的相似性:
val sum: (Int, Int) => Int = (a, b) => a + b // my code
sum: (Int, Int) => Int = <function2> // repl output
REPL 顯示的類型簽名與 ERT 的類型簽名相同。
c++入門教程。
然后分配給匿名函數的值:
REPL中
scala> (i: Int) => i % 2 == 0
res0: Int => Boolean = <function1>
然后分配給 :isEvenres0
scala> val isEven = res0
isEven: Int => Boolean = <function1>
scala> isEven(42)
res1: Boolean = true
如上,函數語法只不過是給匿名函數分配了一個名字.
the function syntax just assigns a value name to an anonymous
function.
Function1 是個trait
scala> val isEven = (i: Int) => i % 2 == 0
isEven: Int => Boolean = <function1>
2個參數的是trait Function2的實例
scala> val sum: (Int, Int) => Int = (a, b) => a + b
sum: (Int, Int) => Int = <function2>
scala高階函數。大多數開發人員不使用此方法;我只是想展示事情在引擎蓋下是如何工作的。
這個定義和上面是等價的~
val isEven = new Function1[Int, Boolean] {def apply(i: Int): Boolean = i % 2 == 0
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态