Czasami przeglądając kod różnych aplikacji można zauważyć kawałki wyglądające mniej więcej tak:
attr_accessor :price
def total_price
p = items.inject(0) {|sum, item| sum + item.price }
# więcej kodu
p
end
W prawdziwej aplikacji można to zobaczyć na przykład w Spree (użycie tot zamiast total)
p oznacza tutaj zapewne price, ale autor kodu intuicyjnie stwierdził, że pisząc “price =”, zamiast stworzenia nowej zmiennej przypisze wartość na atrybut price.
Rzeczywiście jest to intuicyjne i całkiem bezpieczne, ale zupełnie niepotrzebne. Spokojnie i bez żadnego problemu można użyć price. Dlaczego?
W rubim można opuścić słowo self jeżeli chodzi o odczytanie wartości metody. Jeżeli więc bez zadeklarowania zmiennej price ktoś napisałby puts(price), to ruby zinterpretowałby to jako chęć wyświetlenia self.price. Inaczej jest z zapisywaniem. Jeżeli wywołana jest metoda price=, to ruby stworzy nową zmienną.
Na przykład taki kod:
class Product
attr_accessor :price
def initialize(price)
self.price = price
end
def do_something_with_price
price = 10
puts price
puts self.price
end
end
p = Product.new(20)
p.do_something_with_price
Wypisze:
10
20
Na koniec napiszę tylko, że mam mieszane uczucia co do korzystania z tych właściwości języka. Z jednej strony nie lubię jak w kodzie pałętają się skrótowe nazwy zmiennych, ale z drugiej strony taki zapis pokazuje, że chodzi nam o coś innego niż self.costam.
Ja z reguły staram się nie skracać nazw w takich wypadkach. Jakie jest wasze zdanie?