call-by-value và call-by-name trong scala
TIL
594
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.
23 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
18 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 2 năm trước
18 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 hơn 2 năm trước
11 2
White
8 4
Bài viết liên quan
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 1 tháng trước
0 2
White
19 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết gần 2 năm trước
19 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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