Scala Function (Part 2)
Ở Part 1 chúng ta đã làm quen với một vài khái niệm đáng chú ý trong function gồm: Function Declarations, Functions with Named Arguments, Function with Variable Arguments, Nested Functions, Part 2 này sẽ giới thiệu các khái niệm mới đầy thú vị khác gồm: Default Parameter Values for a Function, ...
Ở Part 1 chúng ta đã làm quen với một vài khái niệm đáng chú ý trong function gồm: Function Declarations, Functions with Named Arguments, Function with Variable Arguments, Nested Functions, Part 2 này sẽ giới thiệu các khái niệm mới đầy thú vị khác gồm: Default Parameter Values for a Function, Partially Applied Functions, Anonymous Functions. Rồi, Let's go!.
1. Default Parameter Values for a Function
Scala cho phép chỉ định các giá trị mặc định cho các parameter của function. thông thường khi gọi 1 function, ta cần truyền argument vào hàm được gọi. Ví dụ:
object FunctionScala { def main(args: Array[String]) { println( "Sum Value : " + addInt(12,1) ); } def addInt( a:Int, b:Int ) : Int = { var sum:Int = 0 sum = a + b return sum } }
Output:
Sum Value : 13
Hàm addInt có 2 parameter, trong main addInt được gọi với 2 argument được truyền vào là addInt(12,1).
Với Default parameter values cho phép khai báo value măc đinh cho parameter ngay từ khi khai báo hàm, và khi gọi hàm, không cần truyền argument vào hàm được gọi.
Ví dụ:
object FunctionScala { def main(args: Array[String]) { println( "Sum Value : " + addInt() ); } def addInt( a:Int = 3, b:Int = 2 ) : Int = { var sum:Int = 0 sum = a + b return sum } }
Output:
Sum Value : 5
Trong trường hợp đã khai báo giá trị default cho parameter của function, vẫn có thể gọi hàm và truyền parameter vaò như cách thông thường, khi đấy, giá trị function nhận sẽ là giá trị được truyền vào hàm, giá trị default được bỏ qua.
Ví dụ:
object FunctionScala { def main(args: Array[String]) { println( "Sum Value : " + addInt(3,1) ); } def addInt( a:Int = 3, b:Int = 2 ) : Int = { var sum:Int = 0 sum = a + b return sum } }
Output:
Sum Value : 4
2. Partially Applied Functions
Partially Applied Functions cho phép ràng buộc một số argument và phần argument còn lại của function sẽ được điền vào sau. ví dụ:
import java.util.Date object FunctionScala { def main(args: Array[String]) { val date = new Date log(date, "message1" ) Thread.sleep(1000) log(date, "message2" ) Thread.sleep(1000) log(date, "message3" ) } def log(date: Date, message: String) = { println(date + "----" + message) } }
Output:
Sun Nov 20 17:48:03 ICT 2016----message1 Sun Nov 20 17:48:03 ICT 2016----message2 Sun Nov 20 17:48:03 ICT 2016----message3
Method log() có 2 parametesrs: date và message, khi muốn gọi method này nhiều lần với cùng value date và khác value message, sử dụng Partially Applied Functions, ràng buộc giá trị cho tham số date và không ràng buộc giá trị tham số message bằng cách đặt 1 dấu gạch dưới tại vị trí của nó.
import java.util.Date object FunctionScala { def main(args: Array[String]) { val date = new Date val logWithDateBound = log(date, _: String) logWithDateBound("message1") Thread.sleep(1000) logWithDateBound("message2") Thread.sleep(1000) logWithDateBound("message3") } def log(date: Date, message: String) = { println(date + "----" + message) } }
Output:
Sun Nov 20 17:48:57 ICT 2016----message1 Sun Nov 20 17:48:57 ICT 2016----message2 Sun Nov 20 17:48:57 ICT 2016----message3
3. Anonymous Functions
Anonymous Functions trong source code được gọi là function literals trong lúc chạy, và function literals được khởi tạo trong các objects được gọi là function values. Scala hỗ trợ first-class functions, nghĩa là những function có thể được biểu diễn trong cú pháp function literal, ví dụ (x:Int) => x +1, và những functions đó có thể biểu diễn bởi các objects, cái được gọi là function values
Ví dụ:
- Tạo 1 hàm kế nhiệm cho các số nguyên
var inc = (x:Int) => x+1
Biến inc lúc này là một function và có thể sử dụng như 1 function bình thường
var x = inc(7)-1
- Có thể định nghĩa các hàm với nhiều parameter như sau:
var mul = (x: Int, y: Int) => x*y
Biến mul lúc này là một function và có thể sử dụng như 1 function bình thường
println(mul(3, 4))
- Có thể định nghĩa các hàm không có parameter như sau:
var userDir = () => { System.getProperty("user.dir") }
Biến userDir lúc này là một function và có thể sử dụng như 1 function bình thường
println( userDir )
Kết thúc Part 2, chúng ta bổ sung thêm các khái niệm đáng chú ý về function trong Scala, ở các Part tiếp theo sẽ đi sâu tìm hiểu về các khái niệm và các vấn đề đã được giới thiệu ở 2 Part trên.