Phương thức đọc và ghi
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 7 trên 57.
Viết một phương thức đọc cho mỗi biến thực thể sẽ lặp lại. attr_reader :title trong phần thân lớp tạo ra phương thức title, phương thức này trả về @title. Một dòng có thể liệt kê nhiều tên:
class Book
attr_reader :title, :pages
def initialize(title, pages)
@title = title
@pages = pages
end
end
book = Book.new("Dune", 412)
puts book.title
puts book.pagesĐầu ra:
Dune
412attr_writer :title tạo ra một phương thức thiết lập, phương thức title=, lưu đối số của nó vào @title. Ruby cho phép bạn gọi phương thức này bằng cú pháp gán, book.title = "Emma":
class Book
attr_reader :title
attr_writer :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
book.title = "Dune Messiah"
puts book.titleĐầu ra:
Dune Messiahattr_accessor tạo cả phương thức đọc lẫn phương thức gán. Khi có cả hai, cách viết tắt như += cũng hoạt động, vì player.score += 5 có nghĩa là player.score = player.score + 5:
class Player
attr_accessor :name, :score
def initialize(name)
@name = name
@score = 0
end
end
ada = Player.new("Ada")
ada.score += 5
ada.score += 3
ada.name = "Ada L."
puts "#{ada.name}: #{ada.score}"Đầu ra:
Ada L.: 8Chỉ công khai những gì cần thiết. Dùng attr_reader cho các giá trị mà code bên ngoài có thể đọc nhưng không thể thay đổi, và chỉ thêm phương thức ghi khi thiết kế yêu cầu bên ngoài có thể thay đổi giá trị. Gán giá trị cho thuộc tính chỉ đọc sẽ gây ra NoMethodError:
class Book
attr_reader :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
begin
book.title = "Emma"
rescue NoMethodError => e
puts e.message
end
puts book.titleĐầu ra:
undefined method `title=' for an instance of Book
DuneThử thách
DễHoàn thiện lớp Book. Code bên ngoài có thể đọc title, author và pages, đồng thời có thể đọc và thay đổi pages_read, ban đầu bằng 0. progress trả về Dune: 120/412 (29%), với phần trăm được làm tròn xuống.
Code được cung cấp tạo một quyển sách từ ba dòng đầu vào đầu tiên (tiêu đề, tác giả, số trang). Mỗi dòng tiếp theo là số trang người đọc đã đọc xong; code cộng từng giá trị bằng book.pages_read += n. Cuối cùng, code in ra Dune by Frank Herbert và tiến độ.
Đặt code của bạn trong book.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 'book'
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input = []
while (line = gets)
input << line.chomp
end
book = Book.new(input[0], input[1], input[2].to_i)
input.drop(3).each { |n| book.pages_read += n.to_i }
puts "#{book.title} by #{book.author}"
puts book.progress
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpBiến instancePhương thức và selfto_s và inspectÔn tập: thẻ thư viện4Tính đóng gói
Phương thức riêng tưPhương thức được bảo vệPhương thức thiết lập riêng tưBảo vệ trạng tháiÔn tập: máy bán hàng tự động7Tính đa hình và duck typing
Tính đa hìnhDuck typingPhương thức trừu tượngcase và lớpÔn tập: phương thức thanh toán2Phương thức truy cập và self
Phương thức đọc và ghiPhương thức gán tùy chỉnhself trong phương thứcĐịnh danh và tính bằng nhauÔn tập: Danh sách liên hệTự luyện tập: Trình biên dịch Ruby online