Menu
CoddyTech

Phương thức gán tùy chỉnh

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 8 trên 57.

Setter là phương thức có tên kết thúc bằng =. Tự viết setter thay vì dùng attr_writer giúp bạn làm sạch giá trị trước khi lưu:

class Person
  attr_reader :name

  def name=(value)
    @name = value.strip.capitalize
  end
end

ada = Person.new
ada.name = "   aDA  "
puts "[#{ada.name}]"

Đầu ra:

[Ada]

Một setter cũng có thể từ chối một giá trị bằng cách phát sinh lỗi. Biến thực thể chỉ được gán khi giá trị vượt qua bước kiểm tra, vì vậy đối tượng giữ nguyên trạng thái cũ:

class Product
  attr_reader :price

  def initialize(price)
    @price = price
  end

  def price=(value)
    raise ArgumentError, "price must be positive, got #{value}" if value <= 0

    @price = value
  end
end

item = Product.new(10)
begin
  item.price = -5
rescue ArgumentError => e
  puts e.message
end
puts item.price

Đầu ra:

price must be positive, got -5
10

Một biểu thức gán luôn trả về giá trị ở vế phải, không phải giá trị mà setter trả về hoặc lưu trữ. Hãy đọc lại thuộc tính để xem giá trị đã lưu:

class Thermometer
  attr_reader :celsius

  def celsius=(value)
    @celsius = value.round
  end
end

t = Thermometer.new
result = (t.celsius = 21.7)
puts result
puts t.celsius

Đầu ra:

21.7
22

Phương thức đọc cùng với phương thức thiết lập tùy chỉnh tạo nên một thuộc tính mà code bên ngoài có thể đọc và thay đổi, nhưng chỉ với các giá trị hợp lệ. Chỉ đặt phần kiểm tra trong phương thức thiết lập để mọi thay đổi đều tuân theo cùng một quy tắc:

class Volume
  attr_reader :level

  def level=(value)
    raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)

    @level = value
  end
end
challenge icon

Thử thách

Dễ

Hoàn thiện lớp Person. Setter name= loại bỏ khoảng trắng quanh giá trị và viết hoa chữ cái đầu của mỗi từ ( ada lovelace trở thành Ada Lovelace). Setter age= phát sinh ArgumentError với thông báo invalid age: 200 khi tuổi nằm ngoài khoảng từ 0 đến 150, nếu không thì lưu giá trị đó. Bạn có thể đọc cả hai giá trị.

Một đối tượng Person mới bắt đầu với tên Unknown và tuổi 0. Code được cung cấp đọc các lệnh name text hoặc age n, áp dụng chúng thông qua các setter và in thông tin về người đó dưới dạng Ada Lovelace (36) sau mỗi lệnh, hoặc in thông báo lỗi khi setter từ chối giá trị.

Đặt code của bạn trong person.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 'person'

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input = []
while (line = gets)
  input << line.chomp
end
person = Person.new
input.each do |line|
  command, value = line.split(" ", 2)
  begin
    command == "name" ? person.name = value : person.age = value.to_i
    puts "#{person.name} (#{person.age})"
  rescue ArgumentError => e
    puts e.message
  end
end
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