scala学习-介绍scala的几种特性6

原创 2015年11月19日 22:26:42

案例来自于引路蜂
本文介绍完整的定义一个类。定义函数化对象,函数化对象的意思是所定义的类和对象都不包含任何可以修改的状态。还会介绍Scala的几种特性:类参数和构造函数,方法,操作符,私有成员,重载,过载,条件查询,引用自身。
1类定义规范
定义一个有理数的类。有理数的定义:一个有理数可以表示成分数的形式:n/d,其中n和d都是整数,d不能为0。
因此我们定义的个有理数类,Rational类,能支持上面的描述和有理数的操作。有理数的=-*/<,并且可以支持有理数的规范表达,比如2/10,其规范表达是1/5,分子和分母的最小公倍数为1。
我们开始来定义这个类,定义成函数化对象,就说明里面是没有可变的状态的,即是使用immutable方式来定义。我们需要定义分子和分母。

package org.wq.learn
class Rational (n:Int,d:Int)

这和java中定义的类不一样,定义类的时候可以带参数,这个叫做类参数。类参数就是和构造函数一样的功能哈。这样就简化了代码。
Scala编译器会编译任何不属于类成员和类方法的其他代码,因为这些代码将作为类构造函数,比如在下面打印一条语句。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
}
object Rational extends App{
  new Rational(1,2)
}
结果为:i am a class construction~1/2

可以看见在创建对象的时候,自动执行了主构造函数的代码。
2重定义类的toString方法
当你使用println打印类的时候

 println(new Rational(1,2))
 结果为:org.wq.learn.Rational@74a14482

结果不直观,这是因为,使用了缺省的类作为toString定义(object),缺省打印的是类名+@+16进制对象的地址。所以要重载toString方法。在Scala中,你可以使用override来重载方法,和java一样。override要写在def前面哦。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,2))
}
结果为:1/2

3前提条件检测
有理数分母步能为0,这里是d不能为0。前面定义,d为0是可以运行的。怎么解决分母不能为0的问题呢。面向对象编程的一个有点是数据的封装。对于一个有理数的前提条件是分母步为0,Scala中定义了为传入构造方法和方法的参数的限制范围,也就是说调用这些函数或者方法需要满足这些条件。Scala中使用了require的方法(require为Predef对象定义的一个方法,Scala环境自动载入这个类的定义,无需import),因此修改代码为:

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  require(d!=0)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,0))
}
结果为:i am a class construction~1/0
Exception in thread "main" java.lang.IllegalArgumentException: requirement failed

如果分母为0,就抛出IllegalArgumentException异常。
今天加班太累,就休息了……
明天继续……

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

scala学习-介绍scala的几种特性7

转自:http://blog.csdn.net/wangqi880/article/details/50001193 承接上篇,前提条件检查,使用require。  1添加成员变量  记...

scala学习-介绍scala的几种特性7

承接上篇,前提条件检查,使用require。 1添加成员变量 记得上篇的时候,使用了类参数的方式来构建主构造函数,但是这是由缺陷的。 现在我们构建一个两个rational相加的操作。class ...

Scala学习笔记6--容器

SetSet是无序容器 定义容器 val feeds1 = Set("blog.toolshed.com", "pragdave.pragprog.com", "pragmactic-osxer.b...

Scala学习笔记6 - 隐式转换和隐式参数

===显式类型转换       正如之前所述的,scala中类型转换使用方法实现,以下是显式类型测试和显式类型转换的示例:           ...

programming in scala Ed6.pdf

  • 2010-07-08 07:47
  • 6.78MB
  • 下载

一步步学spark之一scala高级特性中隐式转换,隐式参数,隐式类3.8

一步步学spark之一scala高级特性中隐式转换,隐式参数,隐式类3.8 隐式转换可以扩展类的功能,加上implicit 表示隐式转换,后面跟上要转换的函数 隐式...

[Scala函数特性系列]——高阶函数

带函数参数的函数由于是一个接受函数参数的函数,故被称为高阶函数,像之前讲到的map()函数就是高阶函数。如下例所示: 上述代码中,apply函数接受一个函数f作为参数,接受一个Int类型的参...

Scala中的语言特性是如何实现的(3) -- Trait

我的新博客地址:http://cuipengfei.me/blog/2013/10/13/scala-trait/ 我在Coursera上跟了一门叫做Functional Progr...

一步步学spark之一scala高级特性中泛型类与泛型函数3.6

一步步学spark之一scala高级特性中泛型类 泛型类中的泛型是包容具体类型变换的,对这些具体不同的类型,泛型类根据类型进行统一的操作,很多时候泛型类就相当于模板。 泛型定义一个泛型参数 两...

Scala 特性

Scala 特性 面向对象特性 Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。 类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)