nagl
May 13, 2011, 9:40am
1
Czy można coś takiego zrobić w jednej linijce, bez użycia zmiennej :
dziury = Opona.policz_dziury
puts "Uwaga, opona ma #{dziury} dziur!" unless dziury.zero?
i podwójnego obliczania jej wartości:
puts "Uwaga, opona ma #{Opona.policz_dziury} dziur!" unless Opona.policz_dziury.zero?
?
Opona.policz_dziury.tap { |dziury| puts "Uwaga, opona ma #{dziury} dziur!" unless dziury.zero? }
Możesz cachować wartość metody tuż po jej użyciu.
class Opona
extend ActiveSupport::Memoizable
def policz_dziury
#kod
end
memoize :policz_dziury
end
nagl
May 13, 2011, 1:54pm
4
O cachowaniu myślałem, ale to przerost formy nad treścią w moim przypadku. Natomiast .tap jest fajne, o coś takiego mi chodziło.
Dzięki za odpowiedzi.
Nie byłbym sobą gdybym nie napisał, że szukanie na siłę sposobów by zmieścić coś w 1 linijce jest słabe… Ja wolę Twoją pierwotną wersję (jakoś Object#tap mi tu nie pasuje). Po co ten pęd do jednolinijkowców?
!(n = Opona.policz_dziury).zero? && puts(“Uwaga, opona ma #{n} dziur!”)
trzeba przywyknąć, ale wbrew pozorom to może być czytelne
misiex
August 31, 2011, 8:43pm
9
@arthwood - to już chyba lepiej jakoś tak?:
(n = Opona.policz_dziury).zero? or puts(“Uwaga, opona ma #{n} dziur!”)
staszek
September 1, 2011, 7:08am
10
Nie bój się podwójnych obliczeń w celu poprawy czytelności, jeśli ta metoda licząca dziury nie trwa kilka sekund.
puts "Uwaga, opona ma #{Opona.policz_dziury} dziur!" unless Opona.policz_dziury.zero?
A jeszcze ładniej(ale dłużej) byłoby:
[code=ruby]puts “Uwaga, opona ma #{Opona.policz_dziury} dziur!” if Opona.ma_dziury?
def ma_dziury?
policz_dziury != 0
ew. !policz_dziury.zero?
end[/code]
dfens
September 1, 2011, 7:56am
11
to moze:
puts "Uwaga, opona ma #{holes} dziur!" unless (holes = Opona.policz_dziury).zero?
[quote=misiex]@arthwood - to już chyba lepiej jakoś tak?:
(n = Opona.policz_dziury).zero? or puts(“Uwaga, opona ma #{n} dziur!”)[/quote]
oo dużo lepiej