Menu
CoddyTech

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
412

attr_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 Messiah

attr_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.: 8

Chỉ 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
Dune
challenge icon

Thử 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
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