Menu
CoddyTech

Làm việc với tệp

Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 1 trên 57.

Các chương trình thực tế được chia thành nhiều tệp. Một tệp Ruby tải một tệp khác bằng require_relative, theo sau là đường dẫn của tệp đó tính từ tệp hiện tại, thường không có phần đuôi .rb. Sau dòng đó, bạn có thể dùng các phương thức và lớp trong tệp đã tải:

# greeting.rb
def greeting(name)
  "Hello, #{name}!"
end

# main.rb
require_relative 'greeting'
puts greeting("Ada")

Chạy ruby main.rb sẽ in ra Hello, Ada!: main.rb tải greeting.rb, rồi gọi phương thức của tệp đó.

Chương trình bắt đầu trong tệp bạn chạy, ở đây là main.rb, và Ruby thực thi chương trình từ trên xuống dưới. require_relative chạy tệp khác tại thời điểm đó, nhưng chỉ chạy lần đầu tiên: lần gọi require_relative 'greeting' thứ hai trả về false và không làm gì cả. Bạn chỉ có thể dùng một tên sau khi tệp định nghĩa tên đó đã được tải:

# main.rb
# puts greeting("Bo")          # NoMethodError: greeting.rb chưa được tải
require_relative 'greeting'     # chạy greeting.rb, trả về true
require_relative 'greeting'     # đã tải rồi, trả về false
puts greeting("Bo")

Bố cục thường dùng là mỗi tệp chứa một lớp, với tên tệp dựa theo tên lớp và viết theo kiểu snake_case: class Dog nằm trong dog.rb, class BankAccount nằm trong bank_account.rb. Trong các thử thách của phần này, main.rb chứa code đầu vào/đầu ra được cung cấp và bắt đầu bằng một dòng require_relative cho mỗi tệp, theo thứ tự tải: lớp mà một lớp khác kế thừa sẽ được tải trước.

dog.rb            # class Dog ... end
bank_account.rb   # class BankAccount ... end
functions.rb      # các phương thức (method) hỗ trợ
main.rb           # các dòng require_relative, rồi đến đoạn code đầu vào/đầu ra

Tệp chia sẻ những gì tùy thuộc vào loại tên. Các phương thức (method) được định nghĩa bằng def ở đầu tệp, lớp và hằng số (constant) có thể được mọi tệp tải sau đó sử dụng. Biến cục bộ (local variable) chỉ thuộc về tệp của nó:

# settings.rb
limit = 3                  # Biến cục bộ: chỉ settings.rb thấy biến này
MAX_ITEMS = 3              # Hằng số: có thể truy cập sau khi tải
def limit_text
  "at most #{MAX_ITEMS}"
end

# main.rb
require_relative 'settings'
puts limit_text            # Tối đa 3
puts MAX_ITEMS             # 3
# puts limit               # NameError: biến cục bộ chưa được định nghĩa
challenge icon

Thử thách

Dễ

Chương trình có hai tệp. main.rb tải greeting.rb, đọc tên và in ra kết quả của greeting(name). Hoàn thiện greeting trong greeting.rb để hàm trả về Hello, Ada! với tên Ada, hoặc Hello, friend! khi tên để trống.

Code của bạn nằm trong greeting.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

require_relative 'greeting'

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input = []
while (line = gets)
  input << line.chomp
end
input.each { |name| puts greeting(name) }
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Ruby online