Block, Proc và Lambda trong Ruby

Blocks

Block hiểu đơn giản nó giống phương thức mà không có tên và 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. Cũng có thể sử dụng block là tham số cho phương thức.

# block
  (1..10).each do |i| 
     puts i
  end
​
  (1..10).map{|i| i} 
​
  arr = [1,2,3]
  arr.collect{|n| puts n*2}

Procs

Trong Ruby, proc là một Object và nó đóng vai trò giúp cho việc viết code không vi phạm nguyên tắc lặp lại Don't repeat yourself hay DRY. Một proc sau khi được viết thì có thể được sử dụng nhiều lần. Giống như block, proc có thể dùng làm tham số của phương thức.

 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 proc return nó sẽ ngay lập tức thực hiện mà không quay trở về thức gọi nó:

def even_proc
      even = Proc.new{return "Even"}
      even.call
      "Odd"
    end
    puts even_proc
    # "Even"

Lambda

Lambdas là một Object trong Ruby nó 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.

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

def even_lambda
      even = Lambdas {return "Even"}
      even.call
      "Odd"
    end
    puts even_lambda
    #"Odd"

Bài Viết Liên Quan