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
10Mộ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
22Phươ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
endThử 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
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