文档章节

函数式对象之定义操作符

柳哥
 柳哥
发布于 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里面的 * 方法要比 + 方法优先级高。

© 著作权归作者所有

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

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

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

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

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

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

长平狐
2012/10/08
48
0
C++设计类的注意事项

构造函数 如果没有声明构造函数,编译器会定义一个默认构造函数(无参数、无内容),让你可以不初始化来直接创建对象: 但如果定义了某种形式的构造函数,编译器就不会帮你定义默认构造函数了...

Cloudox_
2017/12/13
0
0
你知道一个空的类里面有什么吗?

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

林世霖
2017/12/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

谷歌 Fuchsia 上手体验,将取代Android/win10

在手机市场领域,Google表现很抢眼,毫无疑问,Android 至今在移动操作系统的市场份额占据绝对领先地位,但是 Android 仍然存在不少问题,碎片化问题严重,在平板以及大屏幕设备上表现糟糕,...

linux-tao
16分钟前
1
0
List、Array与ArrayList

数组在内存中是连续存储的,所以它的索引速度很快,而且赋值和修改元素也非常快,比如: string[] s=new string[3];//赋值 s[0]="a"; s[1]="b"; s[2]="c";//修改 s[1]="b1"; 但是数组...

shimmerkaiye
18分钟前
0
0
Linux 的Lnmp环境下为mysql添加环境变量

一.问题 在Linux 安装完Lnmp 环境后 , 连接Mysql 告诉没有这条命令 mysql -uroot -p 命令失效 因为是源码安装的,所以会出现这样的的原因 。集成环境是不会出现的。 其实很简单,只需要给m...

15834278076
20分钟前
2
0
apolloxlua include函数

include函数不是单独使用的函数, 他并不是标准库的一部分, 你可以使用include函数将某个后缀为 .aop的文档包含到你的文档流中。 因为include是单独处理流, 所以不会在主处理流程中有所表示...

钟元OSS
24分钟前
0
0
【转载分享】做一名较真的工程师

近些年与我共事过的同事,一定知道我至今仍有一个较真的性格。我会:指出同事所写代码的不当命名问题(并帮助改进);指出同事所写文档中的逻辑混乱问题(并辅以修订);指出同事所写PPT中乱...

HellerZhang
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部