我想添加一个内置类型的方法(例如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. C#是否有可能将方法添加到超类
- 3. 是否可以将自定义方法添加到Web2Py的内置“模型”中?
- 4. 是否可以将方法添加到集合中的类中?
- 5. 是否可以在Matlab中将方法添加到containers.Map类?
- 6. 将方法添加到内置类
- 7. 将方法添加到内置类
- 8. 是否有可能将Scala方法转换为python方法
- 9. 将setter方法添加到scala类
- 10. 是否有可能将方法/接口添加到C#中的引用DLL?
- 11. 是否有可能重写Scala中的内置运算符?
- 12. 是否有可能改变Scala中基类/特征的方差?
- 13. 2.7中的Scala类型失败:是否有解决方法?
- 14. 是否有可能获得scala中的方法的分析树?
- 15. 是否有可能将类型参数的类型参数传播到Scala中的参数化类?
- 16. 是否有任何可能的方式将GeoFence添加到Mapbox?
- 17. 是否可以将globalize3添加到外部ActiveRecord模型类中?
- 18. 是否有更简单的方法将属性添加到XCode中的类中?
- 19. 可能找到参数类型方法在Scala中的返回类型,其中参数是基本类型?
- 20. 是否可以将接口添加到现有类型?
- 21. 将方法添加到Rails :: Application子类是否可接受?
- 22. 是否有可能将数据绑定到Silverlight中的方法?
- 23. 是否可以将“文本”添加到swig中的现有类型图?
- 24. 是否有可能将javascript变量添加到escape_javascript语句中?
- 25. 是否有可能在Scala中将isAssignableFrom与类型参数一起使用?
- 26. 是否可以将jframe表单添加到现有类中?
- 27. 是否有可能拥有强类型的GetVirtualPath方法?
- 28. 蟒蛇添加新的方法到内置的类型
- 29. 是否有内置的方法将Bootstrap类分组为“元类”?
- 30. Scala中的所有序列是否有类型类型?
您可以使用'隐class`语法简化这一点了。 – lmm 2015-07-23 14:23:37