Scope (Phạm vi Biến) trong Hàm Ruby
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àmxin_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ượngNguoi
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ộ class và tấ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 classHocSinh
.
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 trongtimes 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 quaself
.
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ì và tránh xung đột biến không mong muốn.

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.
Xem thêm

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