Bu bir süredir merak ettiğim bir şey. #isDefinedAt değerlendirilmiştir desenler her ardından da #apply değerlendirilir, iki ayrı çağrıları içine bu kesiliyor olarakPartialFunction tasarımı verimsiz mi?
if (pf.isDefinedAt(in)) pf(in)
: Bu desene görüyorum. Örneğin:
object Ex1 {
def unapply(in: Int) : Option[String] = {
println("Ex1")
if (in == 1) Some("1") else None
}
}
object Ex2 {
def unapply(in: Int) : Option[String] = {
println("Ex2")
if (in == 2) Some("2") else None
}
}
val pf : PartialFunction[Int,String] = {
case Ex1(result) => result
case Ex2(result) => result
}
val in = 2
if (pf.isDefinedAt(in)) pf(in)
bir PartialFunction çağrılırken
senin desen son maçları kötü durumda,Ex1
Ex2
Ex1
Ex2
res52: Any = 2
, iki kez sizin desenler/presi değerlendirdi ettik yazdırır hangisi. Bu, sadece basit bir sınıf veya liste deseni eşleştirmesi (örneğin, bir XML belgesini ayrıştırıp bir değer nesneleri döndürdüyseniz bir çıkarıcıya sahip olsaydınız) yapan özel çıkarıcılar üzerinde eşleşirken verimsiz hale gelebilir.
Kısmi İşlev # kaldırma sorunu aynı çift değerlendirme:
scala> pf.lift(2)
Ex1
Ex2
Ex1
Ex2
res55: Option[String] = Some(2)
potansiyel iki kere extractors tüm uğramadan tanımlanması durumunda koşullu bir işlevi çağırmak için bir yolu var mı?
Detaylı yanıt için teşekkür ederiz! FunctionWithDefault, aradığım şey gibi görünüyor. – Collin
Performans eşleştirme kodunda karmaşık eşleşme ifadeleri varsa, iki kez desen eşleştirmesi kesinlikle büyük bir performans isabetidir! Ve eğer 'varsayılan' isim ile geçilirse, bunun bir seçenek döndürmekten daha verimli olması nasıl beklenir? Belki de scala-internals okumalıyım. –
Varsayılan yanlışlık var, daha ziyade bir 'I => OO' –