文档章节

函数式对象之定义操作符

柳哥
 柳哥
发布于 2014/06/06 17:36
字数 347
阅读 56
收藏 1

当前Rational加法的实现只是可用,但不够好用。你或许会困惑为什么整数或浮点数可以写成:x + y,而有理数就必须写成: x.add(y) 或者 x add y 。有理数和别的数应该是一样的。数学的角度上看它们甚至比浮点数更接近于自然的本质。为什么就不能使用自然的数学操作符呢?Scala里面你可以做到。
第一步是用通常的数学符号 + 替换add方法。这可以直接做到,因为scala里 +是合法的标识符。我们可以用 + 定义方法名。既然已经做了这么多,不妨再多做一点,类似地定义 * 方法以实现乘法,如例:

package scalaTest
class Rational(n:Int,d:Int) {
    require(d != 0)
    private val g = gcd(n.abs,d.abs)
    val number:Int = n/g
    val denom:Int = d/g
    def this(n:Int) = this(n,1)
    override def toString = number + "/" + denom
    def +(that:Rational):Rational = {
        new Rational(number * that.demon + that.number * d,d * that.denom)
    }
    def *(that:Rational):Rational = {
        new Rational(number * that.number,denom * that.denom)
    }
    def lessThan(that:Rational) = {
        if(this.lessThan(that)) that else this
    }
    private def gcd(a:Int,b:Int):Int = {
        if(b == 0) a else gcd(b,a % b)
    }
}

object M1 {
    def main(args:Array[String]) {
        val r1 = new Rational(1,2)
        val r2 = new Rational(3,5)
        println(r1 + r2)
        println(r1 * r2)
        println(r1 + r1 * r2 
    }
}

注意:前面讲过scala的操作符优先级规则,Rational里面的 * 方法要比 + 方法优先级高。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 206
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
C++复制构造函数以及赋值操作符

当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么——这是通过定义特殊成员:复制构造函数、赋值操作符和析构函数来达到的。如果没有显式定义复制构造...

风筝Fergus
2013/04/21
0
0
C++ primer第二次阅读学习笔记(第14章:重载操作符与转换)

第十四章:重载操作符与转换 重载操作符必须具有至少一个类类型或枚举类型的操作数,这条规则强制重载操作符不能重新定义用于内置类型对象的操作符含义。 重载操作符时使用默认实参是非法的。...

长平狐
2012/10/08
331
0
C++ primer第二次阅读学习笔记(第13章:复制控制)

第十三章:复制控制 如果没有显式定义复制构造函数、赋值操作符,编译器通常为我们定义。 复制构造函数是一种特殊的构造函数,具有单个形参,该形参为对该类类型的引用。当定义一个新对象,当...

长平狐
2012/10/08
51
0
你知道一个空的类里面有什么吗?

虽然这篇文章的标题,看起来是有点找抽——既然一个类是空的,那不就是说里面啥也没有嘛? 比如这样: class empty { }; 上面定义了一个真的很空的空类,一对大括号里面除了空气之外,真的什...

林世霖
2017/12/15
0
0
《深入理解 Scala》第一章 — Scala 一种混合式编程语言

Scala 的预期目标是将面向对象、函数式编程和强大的类型系统结合起来,同时仍然要能写出优雅、简洁的代码。 Scala 视图将以下三组对立的思想融合到一种语言中: 函数式编程和面向对象编程 富...

天天顺利
2016/03/17
169
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
36分钟前
2
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
1
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
2
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部