Metody i self
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 4 z 57.
Metoda może wywołać inną metodę tego samego obiektu bez zapisywania odbiorcy. Ruby kieruje wywołanie do bieżącego obiektu, więc metody opierają się na sobie nawzajem:
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).totalWynik:
35
60Wewnątrz metody self jest obiektem, na którym wywołano tę metodę. Metoda zwracająca self pozwala wywołującemu łączyć kilka wywołań na tym samym obiekcie:
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).countWynik:
7Obiekt może również przekazać samego siebie innemu kodowi za pomocą self, na przykład aby zwrócić zwycięzcę porównania z innym obiektem tej samej klasy:
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).nameWynik:
Ada
AdaNazwy metod odpowiadających na pytanie „tak” lub „nie” kończą się na ?, na przykład empty?. Parametry mogą mieć wartości domyślne, używane, gdy wywołujący pomija argument:
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?Wynik:
false
trueWyzwanie
ŁatwyUzupełnij klasę ShoppingCart. add(name, price) przechowuje produkt i zwraca sam koszyk, dzięki czemu wywołania można łączyć. total zwraca sumę cen, free_shipping? zwraca true dla sumy wynoszącej co najmniej 20, a summary zwraca 3 items, total 12.50 (lub 1 item, total 4.00) z dwoma miejscami po przecinku.
Dostarczony kod dodaje jeden produkt w każdym wierszu wejściowym (name price), łącząc wywołania, a następnie wypisuje summary oraz free shipping: true lub free shipping: false.
Twój kod umieść w pliku shopping_cart.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'shopping_cart'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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?}"
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online