scala菜鳥教程,scala function從入門到理解

 2023-12-06 阅读 17 评论 0

摘要:在 Scala 中,至少有兩種語法形式用于使用 定義函數。最大的區別是:是希望 (a) 讓返回類型為"隱式",這意味著您不顯示它,編譯器推斷它- 還是 (b) 顯式定義函數的返回類型 val add1 = (i: Int) =>

在 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

ERT語法解釋(explicit return type)

在這里插入圖片描述
在任何聲明其輸入和輸出類型的編程語言中,都需要聲明所有這些內容;這只是你如何聲明它們的問題,使每種方法不同。例如,當您查看 Scala 的方法語法時,您會看到它需要完全相同的字段,它們只是排序不同,具有不同的字段分隔符符號:

def sum(a: Int, b: Int): Int = a + b

將函數簽名視為兩個block

scala菜鳥教程?在這里插入圖片描述
第一個塊聲明函數的輸入和返回類型
在這里插入圖片描述
第二個塊聲明函數的參數名稱和實現算法在這里插入圖片描述
此塊的一個關鍵點是,它顯示了輸入參數名稱在算法中的使用方式;參數名稱靠近函數體是有意義的。

=>, the “Universal Transformer”

函數的第一個塊中的符號顯示它將兩個輸入值轉換為返回值:
在這里插入圖片描述
第二個shows how the function transforms its input parameter names with its algorithm:=>
在這里插入圖片描述

IRT (implicit return type)

以下函數確定輸入參數是偶數還是奇數。它返回一個值,但由于您和 Scala 編譯器都可以通過查看函數體來推斷返回類型,因此我不顯式聲明它:isEvenIntBoolean

val isEven = (i: Int) => i % 2 == 0

在這里插入圖片描述

與前面的示例一樣,您可以在簽名中看到"通用轉換"符號將輸入值轉換為輸出值:
在這里插入圖片描述
此 IRT 語法比 ERT 語法更簡潔,并且類似于方法簽名。def

no return

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^

t

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}
}

REPL

有趣的是,無論我使用 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.

isEven is an instance of Function1

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
}

總結

  • function的本質是trait Function1-22的一個實例.
  • function用val 定義
  • 定義function有ERT與IRT兩種語法,簡潔起見,IRT用的較多

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/189369.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息