Tym postem chcę rozpocząć serię którkich wpisów, o konkretnych metodach/konstrukcjach dostępnych w railsach, lub w samym Ruby, Za pomocą których możemy zrobić coś krócej, ładniej, bardziej ruby way.
Czasami pojawia się potrzeba wykonania na obiekcie pewnych operacji, a następnie zwrócenie go.
def foo(name)
product = Product.find_or_initialize_by_name(name)
# tu cos mieszamy z produktem
...
# zapisujemy
product.save
product
end
jak widać na końcu musi być 'product' aby metoda zwracała product, inaczej :foo zwrociła by nam prawde lub fałsz, czyli wynik product.save
Możemy to bardzo elegancko, zastapić, poniższa konstrukcją
returning
def foo(name)
returning Product.find_or_initialize_by_name(name) do |product|
# tu cos mieszamy z produktem
...
# zapisujemy
product.save
end
end
:returning przyjmuje obiekt, przekazuje go do bloku który otrzymuje, a następnie zwraca ten obiekt
tap
Za pomocą :tap możemy zrobić to samo, w troche inny sposob:
def foo(name)
Product.find_or_initialize_by_name(name).tap do |product|
# tu cos mieszamy z produktem
...
# zapisujemy
product.save
end
end
Metoda :tap przyjmuje blok do którego przekazuje self (obiekt na którym została wywołana), a następnie po wykonaniu bloku zwraca self.
Obydwie metody sa dostepne w railsach. Warto wiedzieć że metoda :tap została włączona do Ruby w wersji 1.9.
Za pomocą metody :tap mozemy nawet wiecej poczarować, polecam przejrzenie poniższych linków:
Linki
Tapping method chains with Ruby 1.9
Jak dla mnie to to tylko pogarsza czytelnosc kodu.
Mnie też to na ziemie nie powala, nie w tym przykładzie,
def foo
returning [] do |collection|
end
end
Wydaje mi się bardziej rozsądne, ale to mi …
@teamon To raczej kwestia gustu, osobiscie lubie konstrukcje z returning w rozsadnych miejscach.