[Memo] Call By Name trong Scala
Scala
50
White

Nguyễn Hồng Phúc viết ngày 21/06/2015

Đây là note memo khi mình tìm hiểu về laziness và strictness trong Scala. Note lại để khỏi quên.

Trong scala, khi gọi hàm, tồn tại 2 phương pháp truyền biến: call by value và call by name. Được khai báo như sau:

  • Call by Value

    def func(x : Type)
    
  • Call by Name

    def func(x: => Type)
    

Khi thực hiện Call by Name, giá trị của x, sẽ được tính toán khi ta cần sử dụng tới x. Và sẽ không được cache lại. Như đoạn code sau

def pair2(i: => Int) = { (i, i) }
pair2 { println("hello"); 1 + 1 }

Kết quả sẽ là

hello
hello
res0: (Int, Int) = (2,2)

Để giải quyết vấn đề tính đi tính lại này, ta sử dụng từ khoá lazy: sẽ tính toán khi giá trị bị gọi, và không tính toán lại ở lần gọi sau

def pair2(i: => Int) = { lazy valval j = i; (j, j) }

Một số ví dụ như sau

scala> val x = { println("x"); 15 }
x
x: Int = 15

scala> lazy val y = { println("y"); 13 }
y: Int = <lazy>

scala> x
res0: Int = 15

scala> y
y
res1: Int = 13

scala> y
res2: Int = 13 // ở lần gọi sau, không phải thực hiện println("y") nữa.

Ví dụ khác

scala> class X { val x = { Thread.sleep(2000); 15 } }
defined class X

scala> class Y { lazy val y = { Thread.sleep(2000); 13 } }
defined class Y

scala> new X
res0: X = X@262505b7 // phải đợi 2s để chờ khởi tạo X

scala> new Y
res1: Y = Y@1555bd22 // chả phải chờ gì cả, khởi tạo được y ngay lập tức

scala> val y = new Y
scala> y.y // lúc này mới phải chờ s
res2: Int = 13
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Hồng Phúc

9 bài viết.
41 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
36 9
Một số vấn đề Theo cá nhân tôi, Javascript có lẽ là một trong những ngôn ngữ dễ học, dễ viết nhất. Một web developer mới bắt đầu có lẽ chỉ cần từ ...
Nguyễn Hồng Phúc viết 3 năm trước
36 9
White
16 2
Mở đầu Có lẽ hầu hết những người sử dụng Linux đều biết quyền hạn của 1 file hay folder được đại diện bởi r (read), w (write), x (execute) như hìn...
Nguyễn Hồng Phúc viết hơn 3 năm trước
16 2
White
16 4
Mở đầu Ở (Link), tôi đã tổng kết lại một số nguyên tắc của câu lệnh điều kiện if, phép so sánh == và ===. Chúng ta hãy cùng bắt đầu phần 2 với điề...
Nguyễn Hồng Phúc viết 3 năm trước
16 4
Bài viết liên quan
White
10 0
Kí tự Regex cơ bản Về cơ bản thì các sử lý matching của scala.util.matching.Regex sẽ được "phó thác" (delegate) cho java Regex. Bạn có thể tạo một ...
huydx viết 3 năm trước
10 0
White
7 1
Trong scala kí tự _ được dùng với khá nhiều mục đích .. không liên quan đến nhau. Tạm note lại cái đã khi nào có time sẽ quay lại viết cẩn thận sa...
huydx viết 3 năm trước
7 1
White
0 0
(Bài viết hơi khó hiểu, dành cho bạn nào có hứng thú với type programming trong scala với các thư viện như shapeless chẳng hạn) Thông thường với m...
huydx viết hơn 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
41 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!