11/08/2018, 21:16

Truyền lambda để sử dụng trong một hàm khác

Lần trước mình có chia sẽ với các bạn blog Tìm hiểu về Lambda. Hôm nay mình sẽ chia sẽ thêm một điểm hay khác của lambda. Như các bạn đã biết các bạn có thể sử dụng lambda để gán 1 đoạn code dưới dạng 1 variable vì vậy bạn có thể sử dụng tính năng này để giúp code của bạn có thể được ngắn gọn hơn. ...

Lần trước mình có chia sẽ với các bạn blog Tìm hiểu về Lambda. Hôm nay mình sẽ chia sẽ thêm một điểm hay khác của lambda.
Như các bạn đã biết các bạn có thể sử dụng lambda để gán 1 đoạn code dưới dạng 1 variable vì vậy bạn có thể sử dụng tính năng này để giúp code của bạn có thể được ngắn gọn hơn.
Để truyền lambda sử dụng trong một hàm khác mình sẽ nói sơ qua về yield và &:

  • yield một trong những tính chất của yieldcó thể tự động gọi đoạn code mà nó thấy có liên quan
  • & đứng trước 1 đối số thì mình có thể nhận biết được đó là 1 lambda, đối số này nên ở vị trí cuối cùng trong 1 dãy đối số truyền vào.

Các bạn có thể xem ví dụ dưới đây của mình để hiểu rõ hơn:

Ví dụ 1
Đây là một lambda để tính bình phương thiếu

binh_phuong_thieu= ->(a, b, type) do
  if type == 'hieu'
    a - a*b + b
  else
    a + a*b + b
  end
end

Mình define một method tính, trong đó mình truyền vào 3 tham số gồm a, b và cuối cùng là type ( type này sử dụng để bạn chọn hình thức mà bạn thực hiện là bình phương thiếu của hiệu hay tổng)

def tinh(a, b, type)
  yield(a, b, type)
end

Cách để truyền lambda để sử dụng

puts tinh(2, 4, 'hieu', &binh_phuong_thieu)
puts tinh(2, 4, 'tong', &binh_phuong_thieu)

Ví dụ 2

number = ->(x) { x }

def in_so_each(numbers, &number)
  numbers.each(&number)
end

def in_so_map(numbers, &number)
  numbers.map(&number)
end

puts in_so_each([1,2,3,4,5], &number)
puts in_so_chan([1,2,3,4,5], &number)

Bạn sẽ thắc mắc vì sao ví dụ ở ví dụ 1 mình dùng yield mà ở ví dụ 2 thì không
Bạn định nghĩa ra một lambda và muốn sử dụng phải có một cách nào đó để kích hoạt nó làm việc.
Như ở ví dụ 2 bạn có sử dụng .each hoặc .map để kích hoạt lambda hoạt động còn ở ví dụ 1 thì không có vì vậy bạn phải sử dụng đến yield một trong những tính chất của yield là có thể tự động gọi đoạn code mà nó thấy có liên quan mà.

Bài viết này được xây dựng dựa trên cách hiểu của mình không trích dẫn từ nguồn nào cả, vậy nên nếu có gì mình hiểu nhầm ở đây mong các bạn comment theo tính chất trao đổi kiến thức :)

0