免责声明:我从C#来到Scala,在那里我非常感谢LINQ。 因此,我立刻感觉到家里有迭代器和序列。我错过了“C#风格”的收益,但是我能够通过延续来烹饪我自己...即使它会带来性能损失。
现在,当我在C#中错过了一些集合方法时,我只是将它定义为扩展方法,并且编译器在处理代码方面做得非常好。
在Scala中,我使用 Pimp 丰富我的图书馆方法,但我对表演有点担心。
class RichFoo(f: Foo) {
def baz = f.bar()
def baz2 = f.bar() * 2
}
object RichFoo {
implicit def foo2Rich(f: Foo) = new RichFoo(f)
}
// on the caller side
val f : Foo = ....
f.baz
f.baz2
// this translates, literally, to new RichFoo(f).baz, new RichFoo(f).baz2
如果没有,为什么?对我来说,它看起来是一个安全的优化。我可以向正确的方向“暗示”或“强制”编译器吗?有哪些更快的替代方案?
我想在迭代器/迭代中使用我的算法集合模式,所以我可以把它们写成filter / map / etc collection.baz(lambda).bar(lambda2)
,但我担心它会被证明太“重”。 (与更高效/直接,但丑陋的bar(lambda2, baz(lambda, collection)
)
答案 0 :(得分:3)
作为@ om-nom-nom注释,这里的解决方案(在2.10中)是使用隐式值类。
implicit class RichFoo(val f : Foo) extends AnyVal {
def baz = f.bar()
def bax = f.bar()
}
RichFoo
现在在编译时存在,但在运行时,它被优化为静态方法调用,因此不会造成性能损失。
另请参阅Mark Harrah的Introduction to Value Classes,它从使用角度给出了一个很好的概述。