nokta muhtemelen etrafta olması istemiyoruz, ya da bir şey sen' için yeni bir blok oluşturmak zorunda kalmamak için bir ara değişken oluşturmak kaçınmaktır geçerken yapıyoruz. en biz Ruby gibi kerkenez olduğunu varsayalım:
xs.map(_ + 7).filter(foo).take(n)
ve filtreden sonra hata giderme mesajı yazdırmak istiyorum:
implicit class RubyKestrel[A](val repr: A) extends AnyVal {
def tap[B](f: A => B) = { f(repr); repr }
}
Şimdi de kod bazı satır olduğunu kabul edelim.
{
val temp = xs.map(_ + 7).filter(foo)
println(temp)
temp.take(n)
}
Ugh: tap
olmadan biz bu çizgiyi refactor. Şimdi tap
olduğunu varsayalım:
xs.map(_ + 7).filter(foo).tap(println).take(n)
Whew, yolu daha iyi!
Bir ekleme yöntemine sahip bir yığına sahip olduğumuzu ve başka bir yerde kullanmadan önce yığına bir şeyler eklemek istediğimizi varsayalım. ( ). Ama tap
ile:
def newStack = (new Stack).tap(_ add "whatever")
Oldukça kullanışlı - gerçekten sadece sağlayan bir şeye herhangi bir normal yan etkileyen yöntemini açmak olduğunu yapabilirsiniz zincir aramaları için. Zincirli aramalar genellikle daha düşük çaplı olduğundan, genellikle büyük bir kazançtır.
Çok teşekkürler, anladım! – MaatDeamon
Ayrıca, doğal olarak beni bir _tap_ istemeye itmeme ihtiyacı vardı: Değişkenler yaratmaktan kaçınmak istedim ve sonra bloğun sonunda bunları tekrarlamak istedim. Kod, _tap_ ile daha kısa ve daha okunabilir (Scala'nın kendisinin bir parçası olması gerektiğine inanıyorum). – Frank