文档章节

函数式对象之隐式转换

柳哥
 柳哥
发布于 2014/06/07 10:11
字数 437
阅读 47
收藏 0
点赞 0
评论 0

接着Rational这个例子,方法重载之后,我们可以写 r * 2了,或许可以交换一下操作数,就像2 * r这样。不幸的是这样做还不可以。这里的问题是2 * r等同于2.*(r),因此这是在整数2上的方法调用。但Int类没有带Rational参数的乘法。不过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 demon:Int = d/g
    def this(n:Int) = this(n,1)
    override def toString = number + "/" + denom
    def +(that:Rational):Rational = {
        new Rational(number * that.denon + that.number * d,d * that.denom)
    }
    def +(i:Int):Rational = new Rational(number + i * denom ,denom)
    def *(that:Rational):Rational = {
        new Rational(number * that.number,denom * that.denom)
    }
    def *(i:Int):Rational = new Rational(number * i,denom)
    def lessThan(that:Rational) = {
        this.number * that.denom < that.number * this.denom
    }
    def max(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 {
    //注意这里,隐式转换
    implicit def intToRational(x:Int) = new Rational(x)
    def main(args:Array[String]) {
        val r1 = new Rational(1,2)
        val r2 = new Rational(3,5)
        println(r1 + r2)
        println(r1 * r2)
        //看看这里
        println("测试隐式转换,5 * r1= " + 5 * r1)
    }
}

M1中添加了:implicit def intToRational(x:Int) = new Rational(x)这句代码,这行代码定义了从Int到Rational的转换方法。方法前面的implicit修饰符告诉编译器可以在一些情况下自动调用
请注意,要隐式转换起作用,需要定义在作用范围之内。如果你把隐式转换方法放在Rational定义之内,它就不在解释器的作用范围。我们将在后面介绍更多隐式转换的细节。


© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 0
杭州
技术主管
c++教程(二十二:Type conversions)

———————————————————————— 该系列教程为翻译c++官方教程,点击参考英文原版,水平有限,翻译不通之处敬请谅解! ————————————————————————...

on2way
2017/02/07
0
0
C++雾中风景5:Explicit's better than implicit.聊聊Explicit.

关于Explicit还是Implicit一直是编程语言中能让程序员们干起架的争议。那些聪明的老鸟总是觉得Implicit的规则让他们能够一目十行,减少样板代码的羁绊。而很多时候,Implicit的很多规则会让新...

LeeHappen
01/04
0
0
《深入理解 Scala》第一章 — Scala 一种混合式编程语言

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

天天顺利
2016/03/17
169
0
C++ 对象构造, 拷贝, 赋值和隐式类型转换总结

原文:C++ 对象构造, 拷贝, 赋值和隐式类型转换总结 作者:Breaker C++ 中对象创建(构造)、拷贝、赋值、隐式类型转换的阶段性总结 关心效率和拷贝开销,写在代码注释中 关键字:对象创建、...

晨曦之光
2012/05/23
1K
0
static_cast与dynamic_cast转换

一 C语言中存在着两种类型转换: 隐式转换和显式转换 隐式转换:不同数据类型之间赋值和运算,函数调用传递参数……编译器完成 char ch; int i = ch; 显示转换:在类型前增加 :(Type)变量...

j_m
2012/06/27
0
0
C++ Primer Plus(十一)—— 使用类

不要返回指向局部变量或临时对象的引用,函数执行完毕后,局部变量和临时对象都将消失,引用将指向不存在的数据。 C++对用户定义的运算符重载的限制: 重载的运算符不必是成员函数,但必须至...

吃一堑消化不良
2016/01/22
22
0
static_cast 用法

staticcast 用法 语法: staticcast(expression) 仅当 type-name 可以隐式转换为 expression 所属的类型,或者 expression 可以隐式转换为 type-name 所属的类型,转换才是合法的。否则,编译...

FrankNie0101
2017/06/19
0
0
C++11 标准新特性:Defaulted 和 Deleted 函数

本文转自:http://www.ibm.com/developerworks/cn/aix/library/1212lufangc11new/index.html 简介: 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数。对于 defaulted 函数,编...

长平狐
2013/01/11
502
0
C++11 标准新特性:Defaulted 和 Deleted 函数

简介: 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数。对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义...

IBMdW
2012/12/26
4.5K
16
【C++11】显式转换操作符

隐式类型转换是C++的一个既好又坏的特性。它给人以方便,但可能造成一些十分隐晦的错误。 类型转换提供了一个类型向另一个类型的构造。 class X{public: operator int() const noexcept { re...

风华神使
2015/09/28
150
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
4分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
10分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
14分钟前
0
0
centos 使用yum安装nginx后如何添加模块 10

centos 使用yum安装nginx后如何添加模块 10 centos6.2版本,使用yum来安装了nginx,但是最近需要重新添加模块,所以就傻了,询问下有人知道怎么重新添加模块吗? PS:俺是新手,需要高手救助...

linjin200
17分钟前
0
0
dubbo 资料

dubbo资料网站: https://www.cnblogs.com/a8457013/p/7818925.html

zaolonglei
18分钟前
0
0
大型网站,你是如何架构的?

大型网站,你是如何架构的?

微小宝
20分钟前
0
0
javaScript选框的全选与取消

<div> <input type="button" value="全选" onclick="quan()"> <input type="button" value="取消" onclick="cancel()"> <input type="button" value="反选" onclick="reverse()"> <table> <t......

南桥北木
22分钟前
0
0
七牛云宫静:基于容器和大数据平台的持续交付平台

7 月 6 日上午,在 ArchSummit 2018 深圳站 | 全球架构师峰会上,七牛云工程效率部技术专家宫静分享了《基于容器和大数据平台的持续交付平台》为题的演讲。本文是对演讲内容的整理。
 
 本...

七牛云
28分钟前
1
0
Linux系统下如何查看某个命令的安装位置

1.which + 命令 会出现这个命令的路径,如果不是软链接的话,那么这就是此软件的安装路径;如果是软连接的话,那么进入下一步 2.进入上面的路径下,输入:ls -al 要查照的命令 会出现它的真是...

xiaomin0322
28分钟前
1
0
微信小程序富文本图片处理二

一、将富文本中图片的相对链接地址修改成绝对链接地址 //替换图片链接 data.content = data.content.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function (match......

tianma3798
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部