文档章节

函数式对象之隐式转换

柳哥
 柳哥
发布于 2014/06/07 10:11
字数 437
阅读 50
收藏 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定义之内,它就不在解释器的作用范围。我们将在后面介绍更多隐式转换的细节。


© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 205
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
C++雾中风景5:Explicit's better than implicit.聊聊Explicit.

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

LeeHappen
01/04
0
0
c++教程(二十二:Type conversions)

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

on2way
2017/02/07
0
0
《深入理解 Scala》第一章 — Scala 一种混合式编程语言

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

天天顺利
2016/03/17
169
0
static_cast 用法

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

FrankNie0101
2017/06/19
0
0
C++ 对象构造, 拷贝, 赋值和隐式类型转换总结

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

晨曦之光
2012/05/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

linux-scp 远程拷贝报错原因

刚拿到一台重装后的服务器,远程ssh都正常,但是一scp拷贝东西就报错: 本地确定是有scp命令的,而且如果是本地没有scp不会报后面那句lost connection,因此就是远程没有scp这个命令。因此在...

linuxprobe16
16分钟前
0
0
OSChina 周六乱弹 —— 谁小时候没当过熊孩子呀

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《行尸走肉》- amazarashi 《行尸走肉》- amazarashi 手机党少年们想听歌,请使劲儿戳(这里) @神话 :周五了,周末干啥...

小小编辑
41分钟前
27
1
docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
14
0
1: Cordova 配置WebView可以打开外部链接

一、问题:在使用Cordova生成的Android App中默认情况下WebView中的超链接,如果不是相对链接,会默认使用浏览器打开。 如果想用默认webview打开 解决方案:修改config.xml文件添加链接配置节...

wecloudnet
今天
1
0
Beetl介绍以及集成SpringBoot2.0 ---《Beetl视频课程》(1)

目的:引导阅读官方文档 目标:实现一个自己的博客 一、Beetl介绍 Beetl目前版本是2.9.3,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点。使得开发...

Gavin-King
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部