Zrobienie czegoś ze zmienną, jeśli istnieje

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

O cachowaniu myślałem, ale to przerost formy nad treścią w moim przypadku. :slight_smile: 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?

@radarek +1

W sumie macie rację. :wink:

!(n = Opona.policz_dziury).zero? && puts(“Uwaga, opona ma #{n} dziur!”)

trzeba przywyknąć, ale wbrew pozorom to może być czytelne :wink:

@arthwood - to już chyba lepiej jakoś tak?:

(n = Opona.policz_dziury).zero? or puts(“Uwaga, opona ma #{n} dziur!”)

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]

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 :slight_smile: