12/08/2018, 11:08

Blocks, Procs, and Lambdas

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. ...

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"
0