üretmek için bir skalet koleksiyonu gerçekleştirin, bir default valued map uygulamaya çalışıyorum ve ayrıca bir DefaultingMap
üzerinden, mümkün olduğunda bir DefaultingMap
üretmek için filtreler, haritalar vb.Harita, filtre, vb. Doğru türde
class DefaultingMap[K, V](defaultValue: => V)
extends mutable.HashMap[K, V]
with mutable.MapLike[K, V, DefaultingMap[K, V]] {
override def empty = new DefaultingMap[K, V](defaultValue)
override def default(key: K): V = {
val result = this.defaultValue
this(key) = result
result
}
}
ben tip DefaultingMap
Ben filter
kullanmak nesneleri alırım ama map
kullanmayın zaman:
scala> val counter = new DefaultingMap[Char, Int](0)
counter: DefaultingMap[Char,Int] = Map()
scala> for (c <- "ababcbbb") counter(c) += 1
scala> counter.filter{case (k, v) => v > 1}
res1: DefaultingMap[Char,Int] = Map((a,2), (b,5))
scala> counter.map{case (k, v) => (k, v * 2)}
res2: scala.collection.mutable.HashMap[Char,Int] = Map((a,4), (c,2), (b,10))
Bu iki yöntem arasındaki fark gibi görünüyor
map
bir sürdüğünü İşte benim ilk uygulama var örtük CanBuildFrom
. Bu yüzden ben CanBuildFrom
sağlamak için bir yere bir implicit def
olması gerekiyor. İlk sezgi HashMap yaptıklarından yapmak oldu: Ben bu o derlemek için alacağı inanıyorum
object DefaultingMap extends generic.MutableMapFactory[DefaultingMap] {
def empty[K, V]: DefaultingMap[K, V] = // Not possible!
implicit def canBuildFrom[K, V]:
generic.CanBuildFrom[Coll, (K, V), DefaultingMap[K, V]] =
new MapCanBuildFrom[K, V]
}
ama empty
yöntemini tanımlamak imkansız, çünkü bu yaklaşım işe yaramaz - Bilmen gerekenler defaultValue
olmalı. CanBuildFrom
'u sınıfın kendisinde tanımlayabilseydim, eşlik eden nesne yerine, ben iyi olurdu çünkü defaultValue
orada kullanılabilir.
Bunu nasıl çalıştırabilirim?
MutableMaps zaten Builders olmakla ilgili olan nokta güzeldir - bu kodları birkaç yerde basitleştirir. Parametresiz uygulandığında, ne zaman işe yarayacağını biliyor musunuz? Belki de yaygın değilse, bunun için çok endişelenmiyorum. – Steve
BTW, 'newBuilder' yöntemini düşürdünüz ve doğrudan DefaultingMap'i doğrudan oluşturduysanız daha net olabilir. – Steve
Parameterless 'apply',' breakOut' içinde çağrılır, bu benim bildiğim tek yerdir ... Koleksiyon paketi nesnesine bakın. Ve sen de 'newBuilder' hakkında haklısın. Bununla birlikte, yine de “newBuilder” yöntem tanımını yoldaşta bırakırım. “Harita” nın “Seq” lerle aynı şekilde çalışan arkadaşlarına sahip olsaydı, o zaman faydalı olurdu. Artı, onları 'newBuilder' olan standart' MapFactory 'arkadaşlarıyla uyumlu hale getirir. – axel22