Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
call-by-value và call-by-name trong scala
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 loop
và loop
cũng không được sử dụng bên trong hàm add
.
--tony.dang 24-06-2016





