文档章节

函数式对象之自指向

柳哥
 柳哥
发布于 2014/06/06 15:46
字数 300
阅读 46
收藏 0
点赞 0
评论 0

关键字this指向当前执行方法被调用的对象实例。或者如果使用在构造器里的话,就是正被构建的对象实例。例如,如果要添加方法lessThan,测试当前有理数是否小于传入的参数,可以这样写:

class Rational(:Int,d:Int) {
    require(d != 0)
    val number:Int = n
    val denom:Int = d
    override def toString = number + "/" + denom
    def add(that:Rational):Rational = {
        new Rational(number * that.denom + that.number * d,d * that.denom)
    }
    def lessThan(that:Rational) = {
        this.number * that.demon < that.number * this.denom        //注意这里
    }
}

这里,this.number指向lessThan被调用的那个对象的分子。你也可以去掉this前缀而只写number,两种写法意义相同。下面是不能省略this的例子,在Rational类里添加max方法返回指定有理数和参数中的较大者:

class Rational(n:Int,d:Int) {
    require(d != 0)    //先决条件
    val number:Int = n
    val denom:Int = d
    override def toString = number + "/" + denom
    def add(that:Rational):Rational = {
        new Rational(number * that.denom + that.number * d,d * that.denom)
    }
    def lessThan(that:Rational) = {
        this.number * that.denom < that.number * this.denom
    }
    def max(that:Rational) = {
        if(this.lessThan(that)) that else this    //注意这里
    }
}

这里,第一个this可写可不写,写成(lessThan(that))也是一样的,但第二个this必须写,表示要返回的对象。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 202
博文 394
码字总数 347782
作品 0
杭州
技术主管
call() bind() apply()

call()和apply() 这两个方法都是函数对象的方法,需要通过函数对象来调用。 当函数调用call()和apply()时,函数都会立即执行。 都可以用来改变函数的this对象的指向。 第一个参数都是this要指...

Halukn ⋅ 05/24 ⋅ 0

JS函数浅析之constructor、prototype属性

函数是JS里很神奇的一位童鞋。那么如何创建一个函数呢?简单来说有下面几种形式: 1、定义式 function a() {} 2、声明式 var a = function() {}; // 把一个匿名函数赋给一个变量 3、构造函数...

冯尚实 ⋅ 2011/09/07 ⋅ 0

C++基础知识学习:变量的初始化

C++基本算术类型 类型 含义 最小存储空间 bool 布尔型 - char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 int 整型 16位 long 长整型 32位 float 单精度浮点型 6位有效数字 double...

wqli ⋅ 2016/05/25 ⋅ 0

分析javascript的__proto__属性和constructor属性

在javascript中有三类对象,1用户创建的对象,2构造函数的对象,3原型对象 用户创建的对象,一般意义上使用new语句显式构造的方法。 构造函数的对象,普通的构造函数,即通过new调用生成普通...

bosscheng ⋅ 2013/04/25 ⋅ 2

C++基础知识学习:new与delete表达式

C++中分配的内存大致有三类:静态存储区,栈内存和堆内存 其中,静态存储区是在程序编译阶段就已经分配好的,用于全局变量,static变量等;堆栈是比较常用的对象存储方式。 new和delete是C++...

wqli ⋅ 2016/05/14 ⋅ 0

《javascript高级程序设计》学习记录(四)

js继承,对这一块原本想自己记录一下,但是发现有一个仁兄的博客记录得比我更好,然后就直接借鉴过来了 由于不像那样是真正面向对象的语言,是基于对象的,它没有类的概念。所以,要想实现继...

sunshinewyf ⋅ 2015/11/16 ⋅ 0

理解javascript原型的动态性

function Person(){}Person.prototype.name = 'sun'; var person1 = new Person();alert("Person最初原型:"+person1.name); //第一次重写原型Person.prototype = {constructor : Person, /......

玄影镜心 ⋅ 2015/08/28 ⋅ 0

JavaScript高级程序设计02

面向对象 重点:原型 创建对象 Javascript中没有类的概念,对象是属性的集合,可以想象成成散列表。 对象实例 创建object实例,为它添加方法 对象字面量 其实就是创建object实例的简写形式 ...

白发道长 ⋅ 01/02 ⋅ 0

JavaScript中的继承之原型链

《JavaScript高级程序设计》中涉及到的继承方式:原型链,借用构造函数,组合继承,原型式继承,寄生式继承,寄生组合式继承。 没关系,我当时看完第一遍也是实力懵逼。后来反反复复学了好多...

GeeWay ⋅ 2016/04/15 ⋅ 0

你对JavaScript的构造函数有多了解?

     JavaScript 中的构造函数和其它语言中的构造函数是不同的。 通过 new 关键字方式调用的函数都被认为是构造函数。   在构造函数内部 - 也就是被调用的函数内 - this 指向新创建的对...

webstack前端栈 ⋅ 01/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

服务网关过滤器

过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会...

明理萝 ⋅ 15分钟前 ⋅ 1

【2018.06.21学习笔记】【linux高级知识 14.1-14.3】

14.1 NFS介绍 NFS服务全称是NetWork File System:网络文件系统,最早有sun公司开发的,4.0版本由Netapp公司开发,是基于RPC远程过程调用(Remote Procedure Call)协议的服务。 14.2 NFS服务...

lgsxp ⋅ 24分钟前 ⋅ 0

Day18 vim编辑模式、命令模式与练习

编辑模式 命令模式 :nohl 不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样;如果打开文件,没有任何操作; :wq会更改mtime,但是:x不会。 练习题 扩展 vim的特殊用法 ht...

杉下 ⋅ 28分钟前 ⋅ 0

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { ......

职业搬砖20年 ⋅ 28分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 29分钟前 ⋅ 0

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ...

猴亮屏 ⋅ 31分钟前 ⋅ 0

相对路径和绝对路径

基本概念   文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、Flash、CSS文件的位置。   物理路径:物理路...

临江仙卜算子 ⋅ 35分钟前 ⋅ 0

消息队列属性及常见消息队列介绍

什么是消息队列? 消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个队列的消息可以同时被多个消息消费者消费。分布式消息服务DMS则是分布式的队列系统,消...

中间件小哥 ⋅ 37分钟前 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 37分钟前 ⋅ 0

vim编辑模式、vim命令模式

vim编辑模式 使用vim filename 进入的界面是一般模式,在这个模式下虽然我们能够查看,复制,剪切,粘贴,但是不能编辑新的内容,如何能直接写入东西呢?这就需要进入编辑模式了,从一般模式...

李超小牛子 ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部