函数式对象

这次写点关于函数式对象的吧

class Rational(n:Int, d:Int) { // n,d 为类参数,scala会创造出同样带有这两个参数的主构造器。如果这个类没有主体,可以不写大括号。
println(n+"/"+d)// scala 会把类内部既不是字段也不是方法定义的代码编译至主构造器。因此,该命令 会在实例化对象的时候被执行。
require(d != 0 ) //先决条件。先决条件是对传递给方法或者是构造器的值的限制,是调用者必须要满足的要求。如果失败抛出异常。
override def toString: String = n +"/"+d // override 重写某个函数 返回值类型可以省略,只有一行运算,所以花括号可以省略。这个函数的作用类似与python的 __str__ 或者是 __repr__
private val g = gcd(n.abs,d.abs) // 调用 下面的gac() 私有方法,得到最大公约数。abs方法用于获得绝对值。
val number: Int = n / g // 这两行代码是对下面两行代码的优化,用于将 分子分母 约分 例如 4/6 约成 2/3
val denom: Int = d / g //val number: Int = n //注释1
//val denom: Int = d //注释2 这类似于 python的 def __init__(n,d) 下面的 self.number = n self.denom = d.将参数赋值给对象的字段。供对象调用 def add(that:Rational):Rational={
new Rational(
// n * that.d + that.n * d, d * that.d)//这么是不对的。that代表另一个Rational对象,但是n,d,并没有成为Rational对象的字段。n d只能在这个程序里面访问。所以要先进行注释1 和注释2
number * that.denom + that.number * denom, denom * that.denom)
}
def + (that:Rational):Rational={ //定义 操作符 + 以后可以 r1 + r2 其实是 r1.+(r2)
new Rational(
number * that.denom + that.number * denom, denom * that.denom)
}
def * (that:Rational):Rational = { //定义 * 操作符 以后可以 r1 * r2
new Rational(number * that.number, denom * that.denom) // 这里就省略了 this 直接用的 number 而不是 this.number
}
def lessThan(that:Rational) = {//这里省略了返回值类型。是一个布尔值。Boolean
this.number * that.denom < this.denom * that.number // 自指向 this。感觉类似于python的 self,是指当前类的实例,此种情况可以省略。
}
def max(that: Rational):Rational = {
if (this.lessThan(that)) // 这个this 也可以省略,默认调用自己的方法嘛。。
that
else
this //这里是指这个 Rational 对象本身,所以这种情况,this 肯定是不能省略的。
}
def this(n:Int) = this(n,1) //辅助构造器。主构造器以外的所有构造器。以 def this()开始。每个辅助构造器的第一个动作都是调用同类的别的构造器。但所有的构造器都是以调用主构造器结尾,因此主构造器是类的唯一入口。
// scala 里面,只有主构造器可以调用超类构造器。
private def gcd(a:Int, b:Int):Int = {
if (b == 0)
a
else
gcd(b, a%b)
/*
a b
6 4
a b
4 2
a b
2 0
a
2
*/
} }
命名惯例

类/特质:驼峰式,第一个字母大写 单词首字母大写 如:class ReadBook

函数: 驼峰式 第一个字母小写 首字母大写 如:def readBook

常量: 驼峰式 首字母大写 如:val Readbook

字面量标识符

`` 用反引号包裹的任何字符串。

你可以把运行时环境认可的任意字符串放在反引号之间当作标识符。结果总被scala当作标识符。即使反引号之间的字符串是scala保留字。这个规则也有效。如:在java 的Thread类中访问静态的yield 方法是它的典型应用。你不能写作Thread.yield(),因为yield 是scala保留字。但是你可以如下写法:

scala--函数式对象的更多相关文章

  1. Scala函数式对象-有理数

    有理数类的表示 实现规范:支持有理数的加减乘除,并支持有理数的规范表示 1.定义Rational 首先,考虑用户如何使用这个类,我们已经决定使用“Immutable”方式来使用Rational对象,我 ...

  2. Scala编程--函数式对象

    本章的重点在于定义函数式对象,也就是说,没有任何可变状态的对象的类.作为运行的例子,我们将创造若干把分数作为不可变对象建模的类的变体.在这过程中,我们会展示给你Scala面向对象编程的更多方面:类参数 ...

  3. Scala学习笔记——函数式对象

    用创建一个函数式对象(类Rational)的过程来说明 类Rational是一种表示有理数(Rational number)的类 package com.scala.first /** * Creat ...

  4. Scala 基础(5)—— 构建函数式对象

    有了 Scala 基础(4)—— 类和对象 的前提,现在就可以来构建一个基于 Scala 的函数式对象. 下面开始构造一个有理数对象 Rational. 1. 主构造方法和辅助构造方法 对于每一个类的 ...

  5. Scala函数式编程进阶

    package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...

  6. Scala实战高手****第5课:零基础实战Scala函数式编程及Spark源码解析

    Scala函数式编程 ----------------------------------------------------------------------------------------- ...

  7. 9、scala函数式编程-集合操作

    一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...

  8. Scala函数式编程(三) scala集合和函数

    前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...

  9. Scala函数式编程(四)函数式的数据结构 上

    这次来说说函数式的数据结构是什么样子的,本章会先用一个list来举例子说明,最后给出一个Tree数据结构的练习,放在公众号里面,练习里面给出了基本的结构,但代码是空缺的需要补上,此外还有预留的test ...

  10. scala 函数式编程之集合操作

    Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似. ...

随机推荐

  1. Joyoi花店橱窗(原tyvj1124)

    题目:http://www.joyoi.cn/problem/tyvj-1124 两点注意!!! 1.滚动数组的初始化: 2.字典序操作! 感到很有趣!!! #include<iostream& ...

  2. 在Windows下安装Linux

    使用工具:EasyBCD,该工具支持xp/win7. 安装EasyBCD后新建一个grub启动项: 将Linux ISO文件复制到一个干净的fat分区: 将ISO中的isolinux和images目录 ...

  3. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

  4. Redis在Windows集群中的错误

    创建集群: ./redis-trib.rb  create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:70 ...

  5. [转载]Linux下关于system调用

    曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...

  6. bzoj 1414: [ZJOI2009]对称的正方形

    Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...

  7. java web程序 登陆验证页面 4个页面人性化设置

    到这里,快期末考试了,老师不讲课,我心里有苦不想说,也许没有考虑到老师的感受,让老师难堪了 但是我的行为已不再是我可以做的了.不可能了,我只是职业性的机械的做事了. 思路: 1.第一个是form表单, ...

  8. R语言学习——条件筛选

  9. JAVA的非对称加密算法RSA——加密和解密

    原文转载至:https://www.cnblogs.com/OnlyCT/p/6586856.html 第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一 ...

  10. pomelo RPC调用时新增字段缺失

    接触pomelo开发一个月,正式开始参与项目开发有10天,遇到很多细节的坑,今天讲讲标题:后端服务器节点之间的rpc调用过程中,返回的数据中新增字段缺失问题. 先讲结果:原因是该rpc调用已经采用了p ...