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, 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.


All Rights Reserved