Scala或Jython中多方法的替代方法
发布时间:2020-12-16 18:19:24 所属栏目:安全 来源:网络整理
导读:我经常遇到想要为我无法控制的类添加其他方法的问题.例如,我可能想要一个函数prettyPrint,它可以在没有统一api的不同对象类型上运行(例如特殊的__str__方法). Nice语言和R使用multimethods完成此操作,这可以很好地避免访问者模式.例如,R具有plot()函数.各个
我经常遇到想要为我无法控制的类添加其他方法的问题.例如,我可能想要一个函数prettyPrint,它可以在没有统一api的不同对象类型上运行(例如特殊的__str__方法).
Nice语言和R使用multimethods完成此操作,这可以很好地避免访问者模式.例如,R具有plot()函数.各个程序员可以创建新类来定义数据类型(例如,网络图或股票报价数据).然后,辅助用户/程序员可以编写绘图功能来填写功能,即使他们无法访问图表或股票代码或其他绘图功能的代码. 鉴于我想在以后添加许多功能,使用class.method()似乎是不可行的.每种类型的大量class_plot()函数似乎也是一个坏主意.定义一个检查类型的大plot()函数是不可扩展的. 什么是多方法的替代方案?特别是,我对可能在Jython和Scala中工作的设计感兴趣. 解决方法
在Scala中向类添加方法的最简单方法:
implicit def defSum(l: List[Double]): Double = new AnyRef { def sum = l.foldLeft(0.0)(_ + _) } 或者,在Scala 2.8上,使用处理数字的方法的特殊情况, implicit def defSum[T](l: List[T])(implicit n: Numeric[T]) = new AnyRef { import n.mkNumericOps def sum = l.foldLeft(n.zero)(_ + _) } Scala 2.8上不需要这个,因为它已经定义了sum. 您还可以在实例化时添加特征: // Immutable class case class Point(x: Int,y: Int) // Somewhere else in the code trait MyPlot { self: Point => import self._ def plot = println("At "+x+","+y) } // Usage val p = new Point(1,2) with MyPlot p.plot 你不能做的是动态地(即,在运行时而不是编译时)向对象添加方法.在第一种情况下,您说“将此方法添加到此类”.在第二种情况下,您说“使用此特征创建此对象”.这些都没问题,但“将此方法添加到此对象”则不行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – Angular JS – 表单上的取消按钮禁止提交表单
- windows下安装php5.2.*,php5.3.*,php5.4.*版本的memcache扩
- 如何使Vim在失去焦点时自动保存文件?
- angular项目总结——angular + browserify + gulp + bower
- 表单input项使用label同时引用Bootstrap库导致input点击效果
- 如何让Jupyter Notebook Kernel在Kubernetes中抛出内存错误
- 运维必备规章制度:故障分级和处罚规范
- UNIX网络编程卷1:套接字联网-第7章:套接字选项
- Webservice实现与调用(基于Spring的多种方式)
- 在某个列中更改vim中的背景颜色