我想添加一个内置类型的方法(例如Double),这样我就可以使用一个infix
运算符。那可能吗?是否有可能将方法添加到Scala中的内置类型中?
9
A
回答
17
是的,没有。是的,你可以像似乎像你已经添加了一个方法double
。例如:
class MyRichDouble(d: Double) {
def <>(other: Double) = d != other
}
implicit def doubleToSyntax(d: Double) = new MyRichDouble(d)
此代码添加先前不可用<>
操作者Double
类型的任何对象。只要doubleToSyntax
方法是在范围上,以便它可以不加限定的调用,下面的工作:
3.1415 <> 2.68 // => true
的回答“没有”的一部分来自于事实,你是不是真的添加任何内容到Double
类。相反,您正在创建一个从Double
到一个确定您想要的方法的新类型的转换。这可能是一种比许多动态语言提供的开放类更强大的技术。它也恰好是类型安全的。 :-)
一些限制,你应该知道的:
- 这种技术并不让你删除或重新定义现有的方法,只需要添加新的
- 隐式转换方法(在这种情况下,
doubleToSyntax
)绝对必须在范围内才能使用所需的扩展方法
在语意上,隐式c反转或者放置在单例对象中并被导入(例如, import Predef._
)或在特征内并继承(例如class MyStuff extends PredefTrait
)。略微放在一边:Scala中的“中缀运算符”实际上是方法。与<>
方法没有关系,它允许它是中缀,解析器只是简单地接受它。如果你愿意,你也可以使用“常规方法”作为中缀运算符。例如,Stream
类定义了一个采用单个Int
参数的take
方法,并返回一个新的Stream
。这可以通过以下方式被使用:
val str: Stream[Int] = ...
val subStream = str take 5
的str take 5
表达是字面上相同str.take(5)
。
1
此功能就派上了用场,以实现一个类执行错误的估计:
object errorEstimation {
class Estimate(val x: Double, val e: Double) {
def + (that: Estimate) =
new Estimate(this.x + that.x, this.e + that.e)
def - (that: Estimate) =
new Estimate(this.x - that.x, this.e + that.e)
def * (that: Estimate) =
new Estimate(this.x * that.x,
this.x.abs*that.e+that.x.abs*this.e+this.e*that.e)
def/(that: Estimate) =
new Estimate(this.x/that.x,
(this.x.abs*that.e+that.x.abs*this.e)/(that.x.abs*(that.x.abs-that.e)))
def +- (e2: Double) =
new Estimate(x,e+e2)
override def toString =
x + " +- " + e
}
implicit def double2estimate(x: Double): Estimate = new Estimate(x,0)
implicit def int2estimate(x: Int): Estimate = new Estimate(x,0)
def main(args: Array[String]) = {
println(((x: Estimate) => x+2*x+3*x*x)(1 +- 0.1))
// 6.0 +- 0.93
println(((x: Estimate) => (((y: Estimate) => y*y + 2)(x+x)))(1 +- 0.1))
// 6.0 +- 0.84
def poly(x: Estimate) = x+2*x+3/(x*x)
println(poly(3.0 +- 0.1))
// 9.33333 +- 0.3242352
println(poly(30271.3 +- 0.0001))
// 90813.9 +- 0.0003
println(((x: Estimate) => poly(x*x))(3 +- 1.0))
// 27.037 +- 20.931
}
}
+0
这实际上挺整洁。 :) – 2008-12-16 00:42:01
相关问题
- 1. 是否有可能将实例方法添加到JavaScript中的所有“类”中?
- 2. 是否可以将自定义方法添加到Web2Py的内置“模型”中?
- 3. C#是否有可能将方法添加到超类
- 4. 是否可以将方法添加到集合中的类中?
- 5. 将方法添加到内置类
- 6. 是否有可能将Scala方法转换为python方法
- 7. 是否有可能将方法/接口添加到C#中的引用DLL?
- 8. 是否有可能改变Scala中基类/特征的方差?
- 9. 2.7中的Scala类型失败:是否有解决方法?
- 10. 是否有可能将类型参数的类型参数传播到Scala中的参数化类?
- 11. 是否有任何可能的方式将GeoFence添加到Mapbox?
- 12. 是否可以将globalize3添加到外部ActiveRecord模型类中?
- 13. 是否有更简单的方法将属性添加到XCode中的类中?
- 14. 是否有可能将数据绑定到Silverlight中的方法?
- 15. 是否有可能在Scala中将isAssignableFrom与类型参数一起使用?
- 16. 是否有可能拥有强类型的GetVirtualPath方法?
- 17. 蟒蛇添加新的方法到内置的类型
- 18. 在DWScript中将方法添加到Delphi中的记录类型
- 19. IntelliJ是否可以将@Overrrides添加到特定接口的所有方法中?
- 20. 是否有可能在泛型中有可选类型?
- 21. 是否有可能检测到Java中是否有类可用?
- 22. 检查序列中是否存在值的可能方法scala
- 23. 是否可以将基类的Scala方法重命名?
- 24. 是否有可能与guice一起使用scala自我类型?
- 25. 如何将类型方法添加到Swift中的泛型类型?
- 26. 是否可以通过DynamicProxy将属性添加到类型?
- 27. 是否有可能将所有MKAnnotationView添加到mainMapView?
- 28. 是否有可能在scala中重载原始数值类型的运算符?
- 29. 是否有可能将元组赋值给Scala中的变量?
- 30. 是否可以在String类中添加自定义方法?
您可以使用'隐class`语法简化这一点了。 – lmm 2015-07-23 14:23:37