메서드와 self
Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 4번째.
메서드는 수신자를 작성하지 않고도 같은 객체의 다른 메서드를 호출할 수 있습니다. Ruby는 호출을 현재 객체에 전달하므로 메서드들이 서로를 기반으로 구성됩니다:
class Order
def initialize(price, quantity)
@price = price
@quantity = quantity
end
def subtotal
@price * @quantity
end
def shipping
subtotal >= 50 ? 0 : 5
end
def total
subtotal + shipping
end
end
puts Order.new(10, 3).total
puts Order.new(20, 3).total출력:
35
60메서드 안에서 self는 메서드가 호출된 객체입니다. self를 반환하는 메서드를 사용하면 호출자는 동일한 객체에서 여러 호출을 연결할 수 있습니다:
class Counter
def initialize
@count = 0
end
def add(n)
@count += n
self
end
def count
@count
end
end
puts Counter.new.add(2).add(5).count출력:
7객체는 self를 사용하여 다른 코드에 자기 자신을 전달할 수도 있습니다. 예를 들어 같은 클래스의 다른 객체와 비교한 결과에서 승자를 반환할 수 있습니다:
class Player
def initialize(name, score)
@name = name
@score = score
end
def name
@name
end
def score
@score
end
def winner_against(other)
score >= other.score ? self : other
end
end
ada = Player.new("Ada", 9)
bo = Player.new("Bo", 7)
puts ada.winner_against(bo).name
puts bo.winner_against(ada).name출력:
Ada
Ada예 또는 아니요로 답하는 메서드 이름은 ?으로 끝나며, empty?와 같습니다. 매개변수에는 기본값을 지정할 수 있으며, 호출자가 인수를 생략하면 이 값이 사용됩니다:
class Kettle
def initialize
@temp = 20
end
def hot?
@temp >= 90
end
def heat(degrees = 10)
@temp = [@temp + degrees, 100].min
end
end
k = Kettle.new
k.heat
puts k.hot?
k.heat(75)
puts k.hot?출력:
false
true챌린지
쉬움ShoppingCart 클래스를 완성하세요. add(name, price)는 항목을 저장하고 카트 자체를 반환하므로 호출을 연결할 수 있습니다. total은 가격의 합계를 반환하고, free_shipping?은 합계가 20 이상일 때 true를 반환하며, summary는 소수점 이하 두 자리로 3 items, total 12.50(또는 1 item, total 4.00)를 반환합니다.
제공된 코드는 호출을 연결하여 입력 줄마다 항목 하나(name price)를 추가한 다음 summary와 free shipping: true 또는 free shipping: false를 출력합니다.
코드는 shopping_cart.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.
직접 해보기
require_relative 'shopping_cart'
# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
input << line.chomp
end
cart = input.reduce(ShoppingCart.new) do |c, line|
name, price = line.split
c.add(name, price.to_f)
end
puts cart.summary
puts "free shipping: #{cart.free_shipping?}"
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Ruby 컴파일러