사용자 정의 setter
Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 8번째.
setter는 이름이 =으로 끝나는 메서드입니다. attr_writer를 사용하는 대신 직접 작성하면 값을 저장하기 전에 정리할 수 있습니다:
class Person
attr_reader :name
def name=(value)
@name = value.strip.capitalize
end
end
ada = Person.new
ada.name = " aDA "
puts "[#{ada.name}]"출력:
[Ada]setter는 오류를 발생시켜 값을 거부할 수도 있습니다. 값이 검사를 통과한 경우에만 인스턴스 변수가 할당되므로 객체는 이전 상태를 유지합니다:
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출력:
price must be positive, got -5
10대입 표현식은 setter가 반환하거나 저장하는 값이 아니라 항상 오른쪽에 있는 값을 반환합니다. 저장된 값을 확인하려면 속성을 다시 읽어 보세요:
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출력:
21.7
22리더와 사용자 지정 세터를 함께 사용하면 외부 코드에서 속성을 읽고 변경할 수 있지만, 유효한 값으로만 변경할 수 있습니다. 검사는 세터에만 두어 모든 변경이 동일한 규칙을 거치도록 하세요:
class Volume
attr_reader :level
def level=(value)
raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)
@level = value
end
end챌린지
쉬움Person 클래스를 완성하세요. 해당 setter인 name=은 값 주변의 공백을 제거하고 각 단어의 첫 글자를 대문자로 변환합니다( ada lovelace 는 Ada Lovelace가 됩니다). 해당 setter인 age=는 나이가 0에서 150을 벗어나면 invalid age: 200이라는 메시지와 함께 ArgumentError를 발생시키고, 그렇지 않으면 나이를 저장합니다. 두 값 모두 읽을 수 있어야 합니다.
새로운 Person은 이름이 Unknown이고 나이가 0인 상태로 시작합니다. 제공된 코드는 name text 또는 age n 명령을 읽고, setter를 통해 이를 적용한 다음 각 명령 후 사람을 Ada Lovelace (36)과 같은 형식으로 출력합니다. setter가 값을 거부하면 오류 메시지를 출력합니다.
코드는 person.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
require_relative 'person'
# 제공된 입력/출력 코드: 그대로 유지하세요
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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Ruby 컴파일러