Scope (Phạm vi Biến) trong Hàm Ruby

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 4 tháng 2, 2025

Trong Ruby, scope (phạm vi biến) quyết định nơi một biến có thể được truy cập trong chương trình. Việc hiểu rõ phạm vi biến giúp tránh xung đột biến, đảm bảo mã nguồn rõ ràng và dễ bảo trì.

1. Các Loại Biến trong Ruby

Ruby có nhiều loại biến với phạm vi khác nhau, bao gồm:

Loại biến Ký hiệu Phạm vi
Biến cục bộ biến_thường Chỉ trong block, method, hoặc scope hiện tại
Biến instance @biến_instance Thuộc về một đối tượng cụ thể
Biến class @@biến_class Dùng chung cho tất cả các đối tượng của class
Biến toàn cục $biến_toàn_cục Có thể truy cập từ bất kỳ đâu
Hằng số HANG_SO Có thể truy cập ở mọi nơi nhưng không thể thay đổi (cảnh báo nếu thay đổi)

2. Biến Cục Bộ (Local Variable)

Biến cục bộ có phạm vi giới hạn trong method, block hoặc đoạn code mà nó được khai báo.

Ví dụ:

def xin_chao
  loi_chao = "Xin chào!"  # Biến cục bộ
  puts loi_chao
end

xin_chao      # Output: Xin chào!
puts loi_chao # Lỗi: undefined local variable

Giải thích:

  • loi_chao chỉ tồn tại trong hàm xin_chao, không thể truy cập bên ngoài.

3. Biến Instance (@biến_instance)

Biến instance gắn với một đối tượng cụ thể và có phạm vi trong toàn bộ đối tượng đó.

Ví dụ:

class Nguoi
  def initialize(ten)
    @ten = ten  # Biến instance
  end

  def gioi_thieu
    puts "Xin chào, tôi là #{@ten}!"
  end
end

nguoi1 = Nguoi.new("Nam")
nguoi1.gioi_thieu  # Output: Xin chào, tôi là Nam!

nguoi2 = Nguoi.new("Linh")
nguoi2.gioi_thieu  # Output: Xin chào, tôi là Linh!

Giải thích:

  • @ten là biến instance, mỗi đối tượng Nguoi có giá trị riêng biệt của nó.

4. Biến Class (@@biến_class)

Biến class có phạm vi trong toàn bộ classtất cả các đối tượng của class đó.

Ví dụ:

class HocSinh
  @@so_hoc_sinh = 0  # Biến class

  def initialize(ten)
    @ten = ten
    @@so_hoc_sinh += 1
  end

  def self.so_hoc_sinh
    puts "Tổng số học sinh: #{@@so_hoc_sinh}"
  end
end

h1 = HocSinh.new("Nam")
h2 = HocSinh.new("Linh")

HocSinh.so_hoc_sinh  # Output: Tổng số học sinh: 2

Giải thích:

  • @@so_hoc_sinh dùng chung cho tất cả đối tượng của class HocSinh.

5. Biến Toàn Cục ($biến_toàn_cục)

Biến toàn cục có thể truy cập từ bất cứ đâu trong chương trình. Tuy nhiên, việc sử dụng biến toàn cục không được khuyến khích vì có thể gây khó khăn khi debug và quản lý code.

Ví dụ:

$so_luong = 0  # Biến toàn cục

def them_san_pham
  $so_luong += 1
end

them_san_pham
them_san_pham

puts "Số lượng sản phẩm: #{$so_luong}"  # Output: Số lượng sản phẩm: 2

Giải thích:

  • $so_luong có thể thay đổi từ bất kỳ đâu trong chương trình.

6. Hằng Số (CONSTANT)

Hằng số được khai báo bằng chữ in hoa và có thể truy cập ở bất kỳ đâu. Ruby không ngăn cản việc thay đổi hằng số nhưng sẽ đưa ra cảnh báo.

Ví dụ:

PI = 3.14

def tinh_dien_tich(r)
  PI * r * r
end

puts tinh_dien_tich(5)  # Output: 78.5

PI = 3.14159  # Cảnh báo: already initialized constant PI

Giải thích:

  • PI có thể truy cập từ bất cứ đâu nhưng nếu thay đổi, Ruby sẽ cảnh báo.

7. Phạm Vi Biến trong Block

Ruby có các block (each, times, ...) với phạm vi biến riêng.

Ví dụ:

so = 10

3.times do |i|
  bien_block = i + so
  puts bien_block  # Có thể truy cập trong block
end

puts bien_block  # Lỗi: undefined local variable

Giải thích:

  • bien_block chỉ tồn tại trong times do |i| ... end.

8. Thay Đổi Phạm Vi Biến bằng self

Bạn có thể thay đổi phạm vi biến bằng cách sử dụng self.

Ví dụ:

class Test
  def initialize
    @biến_instance = "Xin chào"
  end

  def hien_thi
    puts self.@biến_instance  # Lỗi: Cannot access instance variable this way
  end
end

t = Test.new
t.hien_thi

Giải thích:

  • Không thể truy cập @biến_instance trực tiếp qua self.

Tổng Kết

Loại biến Ký hiệu Phạm vi
Biến cục bộ biến_thường Chỉ tồn tại trong block hoặc method
Biến instance @biến_instance Thuộc về một đối tượng cụ thể
Biến class @@biến_class Dùng chung cho tất cả các đối tượng của class
Biến toàn cục $biến_toàn_cục Có thể truy cập từ bất kỳ đâu
Hằng số HANG_SO Truy cập ở mọi nơi nhưng không thể thay đổi (có cảnh báo nếu thay đổi)

Việc hiểu rõ phạm vi biến giúp bạn viết code Ruby gọn gàng, dễ bảo trìtránh xung đột biến không mong muốn.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ