轉載自 這裡
前言 :
Scala 是一個可直譯、編譯、靜態、運行於 JVM 之上、可與 Java 互操作、融合物件導向編程特性與函式編程風格的程式語言. Scala 本身具有擴充性,不過這必須了解更多語法特性與細節.
函式重載、區域函式、重複參數 :
Scala 支援函式重載(Overload),函式重載的功能使得程式設計人員能較少苦惱於方法名稱的設計,以統一名稱來呼叫相同功能的方法,函式重載主要根據傳遞引數的資料型態不同,或是參數列的參數個數來呼叫對應的函式,傳回值不是函式重載的區別依據. 以下是個簡單的範例 :
重載在面對基本類型如 Int、Long、Double 等時的規則,基本上是與 Java 相同的,也就是從最嚴格的長度開始試著符合。例如 :
上例中最後一個會尋找長度符合的函式版本,雖然有Int引數,但會自動尋找更長的Long參數函式版本來符合。像下面這個也是可以的 :
但如果是下面這樣的話不行,因為Long的長度比Int大,不會自動裁剪長度來符合函式呼叫 :
注意在 指令互動環境 中沒辦法讓你測試重載函式,後面定義的同名函式之名稱會直接覆蓋先前定義的同名函式. 在 Scala 中,函式中還可以定義函式,稱之為區域函式(Local function),你可以使用區域函式將某個函式中的演算組織為更小的單元,例如,在 選擇排序的實作時,每次會從未排序部份選擇一個最小值放置到已排序部份之後,在底下的範例中,尋找最小值的演算就實作為區域函式的方式 :
可以看到,區域函式的好處之一,就是可以直接存取包裹它的外部函式之參數(或宣告在區域函式之前的區域變數),如此可減少呼叫函式時引數的傳遞. 如果你想實作一個加總所有整數的函式,問題在於使用函式的客戶端可能提供的引數是不固定的,此時你可以使用重複參數(Repeated parameters)。例如 :
只要在參數宣告型態時,旁邊放個 * 符號,該參數就成了可重複參數,可重複參數實際上是陣列,所以上例中,numbers 的型態可以看作是Array[Int](也就是說實際上不是,其實是一種 scala.Seq[T],如果你要取得 scala.Array 實例,可以使用 toArray 方法),reduceLeft 方法接受一個函式物件並且每次會將函式物件的運算結果傳入函式物件作為第一個參數值(第一次第一個參 數預設是0),而陣列的下一個元素作為第二個參數的值. numbers 可以看作是陣列,但實際上不是陣列,所以你不能直接將一個陣列傳入,例如 :
如果你真的要傳入一個陣列,則要在陣列後特別標註 : _*,這告訴編譯器,陣列的每個元素要作為個別引數傳入 sum 函式,例如 :
如果你有興趣再簡化 sum 函式的寫法(有興趣的研究看看為什麼這樣就好,因為會用到許多進階特性),以下是個使用佔位字元 _ 的寫法 :
reduceLeft 方法第一次迭代時預設傳入函式物件的第一個參數值為 0,如果使用 foldLeft 的話,可以指定第一次的傳入值,例如 :
這其實還使用到 Scala 中 鞣製(Curry) 的特性,事實上,foldLeft 有個別名為 /:,記得 : 結尾的方法,是右邊物件所呼叫的方法,上面的sum 函式還可以定義為以下的方式 :
這個函式 = 右邊的讀法是,從 0 開始,每一次 numbers 的元素取出後進行 {} 中的動作,上例 {} 中的動作就是加總.
補充說明 :
* [Scala 小學堂] Scala Gossic : 起步走 - 內建控制結構 (for 運算式)
This is a blog to track what I had learned and share knowledge with all who can take advantage of them
標籤
- [ 英文學習 ]
- [ 計算機概論 ]
- [ 深入雲計算 ]
- [ 雜七雜八 ]
- [ Algorithm in Java ]
- [ Data Structures with Java ]
- [ IR Class ]
- [ Java 文章收集 ]
- [ Java 代碼範本 ]
- [ Java 套件 ]
- [ JVM 應用 ]
- [ LFD Note ]
- [ MangoDB ]
- [ Math CC ]
- [ MongoDB ]
- [ MySQL 小學堂 ]
- [ Python 考題 ]
- [ Python 常見問題 ]
- [ Python 範例代碼 ]
- [心得扎記]
- [網路教學]
- [C 常見考題]
- [C 範例代碼]
- [C/C++ 範例代碼]
- [Intro Alg]
- [Java 代碼範本]
- [Java 套件]
- [Linux 小技巧]
- [Linux 小學堂]
- [Linux 命令]
- [ML In Action]
- [ML]
- [MLP]
- [Postgres]
- [Python 學習筆記]
- [Quick Python]
- [Software Engineering]
- [The python tutorial]
- 工具收集
- 設計模式
- 資料結構
- ActiveMQ In Action
- AI
- Algorithm
- Android
- Ansible
- AWS
- Big Data 研究
- C/C++
- C++
- CCDH
- CI/CD
- Coursera
- Database
- DB
- Design Pattern
- Device Driver Programming
- Docker
- Docker 工具
- Docker Practice
- Eclipse
- English Writing
- ExtJS 3.x
- FP
- Fraud Prevention
- FreeBSD
- GCC
- Git
- Git Pro
- GNU
- Golang
- Gradle
- Groovy
- Hadoop
- Hadoop. Hadoop Ecosystem
- Java
- Java Framework
- Java UI
- JavaIDE
- JavaScript
- Jenkins
- JFreeChart
- Kaggle
- Kali/Metasploit
- Keras
- KVM
- Learn Spark
- LeetCode
- Linux
- Lucene
- Math
- ML
- ML Udemy
- Mockito
- MPI
- Nachos
- Network
- NLP
- node js
- OO
- OpenCL
- OpenMP
- OSC
- OSGi
- Pandas
- Perl
- PostgreSQL
- Py DS
- Python
- Python 自製工具
- Python Std Library
- Python tools
- QEMU
- R
- Real Python
- RIA
- RTC
- Ruby
- Ruby Packages
- Scala
- ScalaIA
- SQLAlchemy
- TensorFlow
- Tools
- UML
- Unix
- Verilog
- Vmware
- Windows 技巧
- wxPython
訂閱:
張貼留言 (Atom)
[Git 常見問題] error: The following untracked working tree files would be overwritten by merge
Source From Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 # git clean -d -fx 方案2: 今天在服务器上 gi...
-
前言 : 為什麼程序管理這麼重要呢?這是因為: * 首先,本章一開始就談到的,我們在操作系統時的各項工作其實都是經過某個 PID 來達成的 (包括你的 bash 環境), 因此,能不能進行某項工作,就與該程序的權限有關了。 * 再來,如果您的 Linux 系統是個...
-
屬性 : 系統相關 - 檔案與目錄 語法 : du [參數] [檔案] 參數 | 功能 -a | 顯示目錄中個別檔案的大小 -b | 以bytes為單位顯示 -c | 顯示個別檔案大小與總和 -D | 顯示符號鏈結的來源檔大小 -h | Hum...
-
來源自 這裡 說明 : split 是 Perl 中非常有用的函式之一,它可以將一個字串分割並將之置於陣列中。若無特別的指定,該函式亦使用 RE 與 $_ 變數 語法 : * split /PATTERN/,EXPR,LIMIT * split /...
沒有留言:
張貼留言