Scala 隐式非常强大。我很好奇它们是 Scala 的新/独特功能,还是其他编程语言中已经存在的概念。
谢谢。
编辑:
为了澄清我的问题,是的,我正在谈论这个具体的实现。一开始,到处都是“隐含的东西”似乎很奇怪,但是使用了一段时间并看到其他人如何使用它,我对它的工作效果印象深刻。
Scala 隐式非常强大。我很好奇它们是 Scala 的新/独特功能,还是其他编程语言中已经存在的概念。
谢谢。
编辑:
为了澄清我的问题,是的,我正在谈论这个具体的实现。一开始,到处都是“隐含的东西”似乎很奇怪,但是使用了一段时间并看到其他人如何使用它,我对它的工作效果印象深刻。
看起来灵感来自 Haskell 的类型类。至少一篇博客文章声称隐含起源于 Haskell 类型类;这篇文章引用了 Martin Odersky 2006 年发表的一篇题为“穷人的类型分类”的论文。Daniel Sobral 最近写了一篇关于如何使用implicits 模拟类型类的文章。
2000 年编程语言原理 (POPL) 上有一篇非常好的论文,其中介绍了隐式参数。它们已在 Haskell 中实现。我确信 Scala 的设计师 Martin Odersky 知道这项工作。(Martin 经常和受欢迎的 POPL 参与者和贡献者。)
另一个参考:“作为对象和隐含的类型类”(2010 年),作者 Bruno C. d. S. Oliveira、Adriaan Moors 和 Martin Odersky。
这取决于您希望将“支持隐含”这一短语扩展的范围。Scala 中隐式的一个令人信服的原因是本质上向现有类(您无权访问)添加方法。这在其他语言中可以通过不同的结构实现:例如,Smalltalk、Ruby 和 Objective-C 都支持向您无法控制的类添加方法。
如果我从http://patricklogan.blogspot.com/2007/06/scala-implicits.html正确理解了隐含,那么是的,有几种语言支持它。
最好的例子是 C# 扩展方法。我最近使用它们的一个例子:
我经常不得不计算两个Point
s 之间的距离。APoint
没有办法计算到另一个点的距离,所以我在我的项目中添加了以下代码:
class MyPointExtension
{
public static Double GetDistance(this Point p1, Point p2)
{
return /* the pythagoras code */
}
}
然后我可以这样做:
Point unitPosition = new Point(x,y);
Point target = new Point(x2,y2);
Double distance = unitPosition.GetDistance(target);
虽然不如 Scala 隐式强大,但 C++ 已经有转换运算符和复制构造函数,它们都可能导致隐式类型转换。结合定义二元运算符的能力(这是 Scala 不允许的),这提供了 Scala 隐含的一些功能。