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

My Mai viết ngày 27/05/2015

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&:

  • 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 :)

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

My Mai

33 bài viết.
177 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
21 8
Lotus là gì? (Link) là một Ruby Web Framework mới với chú trọng vào cấu trúc tách rời với thiết kế đơn giản và dễ hiểu. Hiện tại thì Lotus vừa re...
My Mai viết 3 năm trước
21 8
White
19 21
Bạn muốn load 3 image khác nhau (Ý mình ở đây là dùng tag không phải background nhé) cho 3 loại màn hình khác nhau (small, medium, large). Bạn sẽ l...
My Mai viết hơn 3 năm trước
19 21
White
19 9
Tham gia cộng đồng Thoáng đó cũng đã 2 năm từ lúc tớ tham gia cộng đồng Ruby Việt Nam. Giờ ngồi ngẫm lại được gì và mất gì :v Thật thì chẳng mất...
My Mai viết gần 2 năm trước
19 9
Bài viết liên quan
White
8 6
Chưa xem phần 2? Xem (Link) Trong bài viết này tôi giới thiệu cho các bạn về khái niệm function arity, một cách gọi mĩ miều của số lượng argument ...
Lơi Rệ viết gần 3 năm trước
8 6
White
8 1
Tiếp theo (Link) Mình sẽ hướng dẫn cách test căn bản cho API mình tạo. Thật ra mà nói thì mình phải viết test trước khi làm nhưng mà để tránh việc...
My Mai viết 3 năm trước
8 1
White
4 2
__Chú thích__: Đây là bản dịch tiếng Việt của bài viết gốc của tôi. Nếu bạn muốn xem bản tiếng Anh, xin hãy trỏ tới URL (Link) Lời mở (Link) là ...
Lơi Rệ viết hơn 3 năm trước
4 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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