call-by-value và call-by-name trong scala
TIL
488
Scala
50
White

Dang Viet Ha viết ngày 24/06/2016

call-by-value và call-by-name trong scala

Do một vài lý do thì mặc định trong scala thì các paramter của function sẽ là call-by-value; nghĩa là giá trị của các parameter sẽ được tính toán trước khi thực hiện các xử lý bên trong function. Giả dụ chúng ra có một function add cho phép cộng hai số nguyên như sau

def add(x: Int, y: Int) : Int = x + x

Thì các bước thực hiện tính toán cho việc gọi hàm add(3, 1 + 2) sẽ như sau

add(3, 1 + 2)
add(3, 3)
3 + 3
6

Có vấn đề gì ở đây? Nếu chúng ta có một function lặp vô hạn loop như sau:

def loop: Int = loop

Thì khi gọi hàm add(3, loop) chúng ta cũng sẽ bị rơi vào vòng lặp vô hạn do parameter đang là call-by-value nên giá trị của loop phải được tính toán trước khi thực hiện các phép tính toán bên trong function add mặc dù thực chất trong hàm add thì giá trị loop truyền qua parameter y không được sử dụng đến.

Tuy nhiên, trong một vài trường hợp chúng ta muốn đổi sang cách truyền parameter theo name call-by-name thì chúng ta có thể khai báo lại functionadd như sau

def add(x: Int, y: => Int) : Int = x + x

Khi đó, thì việc gọi hàm add(3, 1 + 2) sẽ được thực hiện theo các bước sau

add(3, 1 + 2)
3 + 3
6

Do parameter y được chỉ định là call-by-name nên không cần phải thực hiện tính toán value của y trước khi thực hiện tính toán bên trong function add. Và việc gọi làm add(3, loop) không còn bị rơi vào vòng lặp vô hạn nữa do không cần phải tính toán giá trị của looploop cũng không được sử dụng bên trong hàm add.

--tony.dang 24-06-2016

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

Dang Viet Ha

12 bài viết.
22 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
14 0
Trong thời điểm hiện tại thì JSON REST API vẫn đang rất phổ biến và phổ thông nhất bởi tính dễ sử dụng của nó. Tuy nhiên, các hãng công nghệ lớn lu...
Dang Viet Ha viết hơn 1 năm trước
14 0
White
11 2
Gần đây, tôi có tham gia vào một sự kiện của (Link) và biết được việc sử dụng (Link) để tự động hoá công việc của các sysadmin khá tiện dụng. Hôm n...
Dang Viet Ha viết gần 2 năm trước
11 2
White
8 4
Dang Viet Ha viết gần 2 năm trước
8 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 hơn 2 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 hơn 2 năm trước
7 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
22 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á!