函数式对象

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

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. POJ1639顶点度限制最小生成树

    题目:http://poj.org/problem?id=1639 见汪汀的<最小生成树问题的拓展>. 大体是先忽略与根节点相连的边,做一遍kruscal,得到几个连通块和一个根节点: 然 ...

  2. Microsoft Dynamics CRM 2011 常用JS 按F12 改动窗体上数据的方法

    1.按F12打开控制台输入下面代码: contentIFrame.Xrm.Page.getAttribute("new_status").setValue(50);//设值cont ...

  3. 【python】网络编程-TCP协议套接字

    服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSI ...

  4. ASP 三十二条精华代码 (1)

    ASP 三十二条精华代码 (1) 2009-08-10 09:53:03  www.hackbase.com  来源:互联网 1. oncontextmenu="window.event.r ...

  5. go的module用法

    新版不需要项目放在GOPATH里面了,这个恶心的机制之前还被n多人捧臭脚.简单列一下用法 新建项目 cd 项目目录go mod init 项目名 写好代码 go build 或者 go mod tid ...

  6. securecrt8注册码

    securecrt8注册码,两个可用 Name:meisiCompany:TEAM ZWTSerial Number:03-14-367662License Key:ACCFAX R9FHJ7 QZV ...

  7. Oracle内存详解之二 Library cache 库缓冲-转载

    Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedu ...

  8. Thread 1 cannot allocate new log的问题分析 (转载)

    Thread 1 cannot allocate new log的问题分析 发生oracle宕机事故,alert文件中报告如下错误: Fri Jan 12 04:07:49 2007Thread 1 ...

  9. spark1.0属性配置以及spark-submit简单使用

    在spark1.0中属性支持三种配置方式: 1.代码 在代码中构造SparkConf时指定master.appname或者key-value等 val conf = new SparkConf(); ...

  10. ECCV 2018 | 给Cycle-GAN加上时间约束,CMU等提出新型视频转换方法Recycle-GAN

    CMU 和 Facebook 的研究者联合进行的一项研究提出了一种新型无监督视频重定向方法 Recycle-GAN,该方法结合了时间信息和空间信息,可实现跨域转换,同时保留目标域的风格.相较于只关注空 ...