文档章节

Scala学习(四)

 如风达
发布于 2015/10/13 14:57
字数 737
阅读 51
收藏 2

抽象类定义:abstract class Element{ def contents:Array[String]; def height = contents.length}

定义无参数方法:如果仅提供对象的某个数据的访问(没有副作用的方法),那么久省略括号。定义成无参数方法。

如果无参数方法用用到的地方较多并且比较频繁,建议把无参数方法def height = contents.length变成val height = 

contents.length的字段值。两者的区别是:因为字段值在类初始化的时候被预编译,而方法调用在每次调用的时候都需要计算,

另一方面,使用字段需要为每个Element对象分配更多空间。所以用无参数方法还是字段值看情况而定。

在scala中字段和方法属于相同的命名空间。这让字段可以重写无参数方法。

class WontCompile{ private var f = 0; def f = 1;}//编译无妨通过,因为字段和方法重名了。

java为定义准备了4个命名空间(分别是字段,方法,类,包),scala仅有2个命名空间(值(字段,方法,包,单例对象),类型(类和特质名))


implicit基本含义

在Scala中有一个关键字是implicit

我们先来看一个例子:

def display(input:String):Unit = println(input)

我们可以看到,display函数的定义只是接受String类型的入参,因此调用display("any string")这样的函数是没问题的。但是如果调用display(1)这样的入参不是String类型的话,编译会出错的。

如果我们想让display函数也能够支持Int类型的入参的话,除了我们重新定一个def display(input:Int):Unit = println(input)这样的函数以外,我们还可以在相同的作用域内用implicit关键字定义一个隐式转换函数,示例代码如下:

object ImplicitDemo {  def display(input:String):Unit = println(input)

  implicit def typeConvertor(input:Int):String = input.toString

  implicit def typeConvertor(input:Boolean):String = if(input) "true" else "false"//  implicit def booleanTypeConvertor(input:Boolean):String = if(input) "true" else "false"


  def main(args: Array[String]): Unit = {
    display("1212")
    display(12)
    display(true)
  }

}

我们定义了2个隐式转换函数:

  implicit def typeConvertor(input:Int):String = input.toString

  implicit def typeConvertor(input:Boolean):String = if(input) "true" else "false"

这样display函数就可以接受String、Int、Boolean类型的入参了。注意到上面我们的例子中注释的那一行,如果去掉注释的那一行的话,会在运行的时候出现二义性:

Error:(18, 13) type mismatch;
 found   : Boolean(true)
 required: StringNote that implicit conversions are not applicable because they are ambiguous:
 both method typeConvertor in object ImplicitDemo of type (input: Boolean)String
 and method booleanTypeConvertor in object ImplicitDemo of type (input: Boolean)String
 are possible conversion functions from Boolean(true) to String
    display(true)
            ^

得出的结论是:

  1. 记住隐式转换函数的同一个scop中不能存在参数和返回值完全相同的2个implicit函数。

  2. 隐式转换函数只在意 输入类型,返回类型。

  3. 隐式转换是scala的语法灵活和简洁的重要组成部分


© 著作权归作者所有

共有 人打赏支持
粉丝 7
博文 255
码字总数 22313
作品 0
深圳
Scala 学习笔记 模式匹配

1. 模式匹配简介 模式匹配是 Scala 的重要特性之一,前面两篇笔记Scala学习笔记(六) Scala的偏函数和偏应用函数、Scala学习笔记(七) Sealed Class 和 Enumeration都是为了这一篇而铺垫准备的...

Tony沈哲
2017/05/16
0
0
Scala高阶函数、闭包、​柯里化

一、高阶函数 二、闭包 三、柯里化 四、Actor 一、高阶函数 scala的高阶函数: 二、闭包 scala 的闭包:函数里面引用外面类成员变量叫作闭包.例: 三、柯里化 四、Actor scala的多线程Actor...

wenhui12345
2017/12/08
0
0
Intellij IDEA 11.1.3+Scala环境搭建

最近由于科研需要,开始学习Scala。阅读了很多的帖子,也看了很多的讨论,决定使用Intellij IDEA这个IDE。 开始试着按照网上的帖子,进行Intellij IDEA + Scala环境的搭建,却没有成功。帖子...

找一片天空散步
2012/10/18
0
17
【Scala-ML】如何利用Scala构建并行机器学习系统

引言 在学习Scala的过程中,我发现其在构建大规模分布式计算系统上有与生俱来的特质。其丰富的类型系统可以帮助编程设计提供很好的信息隐藏和抽象,其monoids和monads概念利用Scala高阶函数实...

JasonDing
2016/03/19
0
0
Spark1.0.0伪分布安装指南

一、下载须知 软件准备: spark-1.0.0-bin-hadoop1.tgz 下载地址:spark1.0.0 scala-2.10.4.tgz 下载下载:Scala 2.10.4 hadoop-1.2.1-bin.tar.gz 下载地址:hadoop-1.2.1-bin.tar.gz jdk......

开拓者-2017
2014/07/21
0
6

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
9
0
现场看路演了!

HiBlock
昨天
19
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
12
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
20
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部