Blocks, Procs, and Lambdas
Bài đăng này đã không được cập nhật trong 9 năm
Blocks
blocks hiểu đơn giản nó giống phương thức mà không có tên.
blocks không phải là Object trong Ruby.
blocks chỉ được sử dụng một lần không giống phương thức nó có thể được sử dụng nhiều lần bất cứ khi nào nó được gọi.
blocks có thể dùng là tham số cho phương thức.
ví dụ:
(1..10).each do |i|
puts i
end
(1..10).map{|i| i}
arr = [1,2,3]
arr.collect{|n| puts n*2}
Procs
Procs giúp cho việc viết code không bị lặp lại "Don't repeat yourself (DRY)".
Procs là một Object trong Ruby.
Procs viết một lần và có thể được sử dụng nhiều lần.
Procs không kiểm tra số đối số truyền tới nó nghĩa là nếu đối số sai nó lờ đi và gán nil.
Procs có thể dùng làm tham số của phương thức.
ví dụ:
even = Proc.new{|n| puts n if n % 2 == 0}
[1,2,3,4,5,6].collect(&even)
strings = ["1", "2", "3"]
num = strings.map(&:to_i)
Khi một procs return nó sẽ ngay lập tức thực hiện mà không quay trở về thức gọi nó
ví dụ:
def even_proc
even = Proc.new{return "Even"}
even.call
"Odd"
end
puts even_proc
# "Even"
Lambdas
Lambdas là một Object trong Ruby.
Lambdas có thể truyền tới một phương thức.
Lambdas kiểm tra số đối số truyền tới nó và ném ra lỗi nếu số đối số sai.
ví dụ:
strings = ["May","June", "July"]
symbols = strings.collect(&lambdas{|m| m.to_sym})
Khi một Lambdas return nó sẽ không ngay lập tức trả về phương thức gọi nó.
ví dụ:
def even_lambda
even = Lambdas {return "Even"}
even.call
"Odd"
end
puts even_lambda
#"Odd"
All rights reserved