Khóa học ruby

Blocks trong Ruby

0 phút đọc

Trong Ruby, block là một tính năng mạnh mẽ và linh hoạt, cho phép bạn nhóm các dòng lệnh lại với nhau và thực thi chúng trong một ngữ cảnh nhất định. Block có thể được hiểu như là một đoạn mã không tên, được sử dụng để thực hiện một hành động cụ thể nào đó. Block thường được sử dụng trong các phương thức như iterators hoặc callbacks, và là một phần không thể thiếu trong việc lập trình Ruby, đặc biệt là trong các framework như Ruby on Rails

Cấu trúc cơ bản của Block

Block trong Ruby có thể được định nghĩa bằng cặp từ khóa do...end hoặc dấu ngoặc nhọn {...}, tùy thuộc vào sự lựa chọn của người lập trình hoặc yêu cầu của đoạn mã. Cả hai cách này đều nhằm mục đích nhóm các dòng lệnh lại với nhau để thực thi như một đơn vị

Ví dụ về cấu trúc Block:

ruby Copy
# Sử dụng do...end cho block nhiều dòng
[1, 2, 3].each do |n|
  puts "Number #{n}"
end

# Sử dụng {} cho block một dòng
[1, 2, 3].each { |n| puts "Number #{n}" }

Trong các ví dụ trên, each là một phương thức của Array, được gọi với một block. Mỗi phần tử của mảng sẽ được truyền vào block như một tham số, và block sẽ được thực thi cho mỗi phần tử.

Sử dụng yield và truyền Block vào phương thức

Một trong những cách sử dụng block hiệu quả là thông qua từ khóa yield. yield cho phép một phương thức gọi đến block được truyền vào khi phương thức đó được gọi

Ví dụ về yield:

ruby Copy
def print_numbers
  yield 1
  yield 2
  yield 3
end

print_numbers { |number| puts number * 10 }

Trong ví dụ này, phương thức print_numbers sử dụng yield để truyền các số 1, 2, và 3 vào block. Block sau đó nhân mỗi số với 10 và in kết quả ra màn hình.

Kiểm tra Block có được truyền vào không

Trong trường hợp không chắc chắn rằng một block có được truyền vào phương thức hay không, bạn có thể sử dụng phương thức block_given? để kiểm tra. Điều này giúp tránh lỗi khi gọi yield mà không có block nào được truyền vào

Ví dụ kiểm tra block:

ruby Copy
def print_if_block_given
  if block_given?
    yield
  else
    puts "No block given"
  end
end

print_if_block_given
print_if_block_given { puts "Block is given" }

Khái niệm về Procs và Lambdas

Trong Ruby, ngoài block, còn có hai khái niệm liên quan khác là Procs và Lambdas. Cả hai đều là các đối tượng có thể gọi được, giúp bạn lưu trữ block vào trong biến và tái sử dụng chúng

Ví dụ về Procs và Lambdas:

ruby Copy
# Tạo một Proc
square = Proc.new { |x| x * x }
puts square.call(5)  # Output: 25

# Tạo một Lambda
say_hello = -> { puts "Hello" }
say_hello.call  # Output: Hello

Kết luận

Block trong Ruby là một công cụ mạnh mẽ cho phép bạn viết mã linh hoạt và sáng tạo hơn. Bằng cách sử dụng block, yield, Procs, và Lambdas, bạn có thể tạo ra các đoạn mã tái sử dụng và dễ đọc, đồng thời tận dụng tối đa sức mạnh của Ruby trong việc xây dựng các ứng dụng phức tạp. Hiể

Avatar
Được viết bởi

Admin Team

Gợi ý câu hỏi phỏng vấn

Không có dữ liệu

Không có dữ liệu

Gợi ý bài viết
Không có dữ liệu

Không có dữ liệu

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào