Ruby cung cấp một loạt các biến được định nghĩa trước (predefined variables) giúp lập trình viên truy cập thông tin về trạng thái hiện tại của chương trình, các cờ (flags) và hệ thống. Những biến này có thể rất hữu ích trong việc đơn giản hóa các script hoặc gỡ lỗi các vấn đề. Tuy nhiên, việc sử dụng chúng trong các thư viện không được khuyến khích vì chúng ảnh hưởng đến hành vi của toàn bộ chương trình. Bài viết này sẽ đi sâu vào các biến được định nghĩa trước trong Ruby, bao gồm cú pháp, các biến phổ biến và cách sử dụng chúng với các ví dụ minh họa.
Cú pháp của Biến Được Định Nghĩa Trước
Các biến được định nghĩa trước trong Ruby luôn bắt đầu bằng ký tự $
. Chúng có thể là các biến toàn cục, biến đặc biệt hoặc các biến hệ thống. Dưới đây là một số biến phổ biến và cách sử dụng chúng.
Các Biến Được Định Nghĩa Trước Phổ Biến
Biến Toàn Cục (Global Variables)
$!
: Thông báo lỗi của exceptions cuối cùng được ném ra. Alias là$ERROR_INFO
.$@
: Mảng chứa backtrace của exceptions cuối cùng được ném ra. Alias là$ERROR_POSITION
.$/
: Ký tự phân tách bản ghi đầu vào, mặc định là newline. Alias là$INPUT_RECORD_SEPARATOR
.$\
: Ký tự phân tách bản ghi đầu ra choprint
vàIO#write
, mặc định lànil
. Alias là$OUTPUT_RECORD_SEPARATOR
.$,
: Ký tự phân tách trường đầu ra choprint
vàArray#join
, mặc định lànil
. Alias là$OUTPUT_FIELD_SEPARATOR
.$;
: Ký tự phân tách mặc định choString#split
, mặc định lànil
. Alias là$FIELD_SEPARATOR
.$.
: Số dòng cuối cùng được đọc từ tệp đầu vào hiện tại. Alias là$INPUT_LINE_NUMBER
.$<
: Đối tượng cho phép truy cập vào nội dung của tất cả các tệp được cung cấp dưới dạng đối số dòng lệnh hoặc$stdin
. Alias là$DEFAULT_INPUT
.$>
: Đích đến của đầu ra choprint
vàprintf
, mặc định là$stdout
. Alias là$DEFAULT_OUTPUT
.$0
: Tên của chương trình Ruby hiện tại đang được thực thi.$$
: PID của quá trình Ruby hiện tại đang được thực thi.$?
: Trạng thái thoát của quá trình cuối cùng được kết thúc.$:
: Mảng chứa các thư mục được tìm kiếm khi tải các tệp bằng phương thứcload
vàrequire
. Alias là$LOAD_PATH
.$DEBUG
: True nếu tùy chọn dòng lệnh-d
hoặc--debug
được chỉ định.$FILENAME
: Tên của tệp hiện tại đang được đọc từ$<
. Alias là$<.filename
.$SAFE
: Mức độ an toàn của Ruby, từ 0 đến 4.
Ví dụ về Sử Dụng Các Biến Được Định Nghĩa Trước
Ví dụ 1: Sử dụng $0
và $$
ruby
puts "Tên script: #{$0}"
puts "PID của quá trình: #{$$}"
Ví dụ 2: Sử dụng $!
và $@
ruby
begin
raise "Lỗi giả lập"
rescue => e
puts "Thông báo lỗi: #{$!}"
puts "Backtrace: #{$@.join("\n")}"
end
Ví dụ 3: Sử dụng $/
và $\
ruby
$/ = ","
$\ = "\n"
data = "1,2,3,4,5"
puts data.split
Ví dụ 4: Sử dụng $<
và $>
ruby
# Tạo một tệp tạm thời để đọc
File.open("temp.txt", "w") do |file|
file.puts "Dòng 1"
file.puts "Dòng 2"
end
# Đọc tệp sử dụng $<
$< = File.open("temp.txt")
while line = $<.gets
puts line
end
# Xóa tệp tạm thời
File.delete("temp.txt")
Các Biến Đặc Biệt Khác
Biến Liên Quan Đến Regular Expressions
$&
: Chuỗi khớp với mẫu cuối cùng. Alias là$MATCH
.- `$``: Chuỗi trước khi khớp với mẫu cuối cùng.
$'
: Chuỗi sau khi khớp với mẫu cuối cùng.$+
: Nhóm khớp cao nhất trong mẫu cuối cùng.$1
,$2
, ...: Các nhóm khớp trong mẫu cuối cùng.
Ví dụ về Sử Dụng Các Biến Regular Expressions
ruby
text = "Chào mừng đến với Ruby!"
if text =~ /(mừng)/
puts "Chuỗi khớp: #{$&}"
puts "Trước khi khớp: #{$`}"
puts "Sau khi khớp: #{$'}"
puts "Nhóm khớp: #{$1}"
end
Các Biến Hệ Thống
$stdin
: Đầu vào chuẩn hiện tại.$stdout
: Đầu ra chuẩn hiện tại.$stderr
: Đầu ra lỗi chuẩn hiện tại.$VERBOSE
: Cờ verbose, được thiết lập bởi tùy chọn-v
hoặc-w
.$LOADED_FEATURES
: Mảng chứa tên các module đã được tải bởirequire
.$LOAD_PATH
: Mảng chứa các thư mục được tìm kiếm khi tải các tệp bằngload
vàrequire
.
Ví dụ về Sử Dụng Các Biến Hệ Thống
ruby
puts "Đầu vào chuẩn: #{$stdin}"
puts "Đầu ra chuẩn: #{$stdout}"
puts "Đầu ra lỗi chuẩn: #{$stderr}"
puts "Cờ verbose: #{$VERBOSE}"
puts "Các module đã tải: #{$LOADED_FEATURES.join(", ")}"
puts "Đường dẫn tải: #{$LOAD_PATH.join(", ")}"
Kết Luận
Các biến được định nghĩa trước trong Ruby cung cấp nhiều thông tin hữu ích về trạng thái hiện tại của chương trình và hệ thống. Chúng có thể được sử dụng để đơn giản hóa các script, gỡ lỗi và quản lý các tác vụ phức tạp. Tuy nhiên, việc sử dụng chúng trong các thư viện không được khuyến khích vì chúng ảnh hưởng đến hành vi của toàn bộ chương trình. Bằng cách hiểu và sử dụng đúng các biến này, bạn có thể viết mã Ruby hiệu quả và an toàn hơn.