前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
之前看Scala编程思想学习Scala,只看完了一半多,就没再继续深入学习,导致一些Scala基础知识还不知道,而且过去这么长时间了,之前学过的也遗忘了,所以这里主要记录自己学习Scala时容易遗忘的一些点,以备自己随时查看,增加记忆。这个主要给自己用,不定时更新添加~
1、在线文档
2、一些点
setter
setter方法是在getter方法的后面加上_=,后面跟着参数
构造方法的参数
主构造方法中带有val和var的参数时公有的。然而由于val是不可变的,所以不能像下面这样去使用。
1 | class Point(val x: Int, val y: Int) |
不带val或var的参数是私有的,仅在类中可见。
1 | class Point(x: Int, y: Int) |
特质
之前只知道trait,Scala的接口用trait,而不知道Scala特质,其实特质就是trait…
特质 (Traits) 用于在类 (Class)之间共享程序接口 (Interface)和字段 (Fields)。 它们类似于Java 8的接口。 类和对象 (Objects)可以扩展特质,但是特质不能被实例化,因此特质没有参数。
- 使用特质:使用 extends 关键字来扩展特质。然后使用 override 关键字来实现trait里面的任何抽象成员
1 | trait Iterator[A] { |
- 实现多个Traits用with关键字
1 | extends Trait1 with Trait2 with Trait3 |
隐式参数
方法可以具有 隐式 参数列表,由参数列表开头的 implicit 关键字标记。 如果参数列表中的参数没有像往常一样传递, Scala 将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递。
简单的程序示例:
1 | def fun(a:Int)(implicit b:Int = 0) = { |
fun(1) 结果:(1,0)
添加隐式值:
1 | implicit val implicitInt:Int = 10 |
结果变为:(1,10)
参数b为隐式参数,调用fun时不能传参数b,首先会找隐式定义类型为Int的值,如果找到(implicitInt),则传隐式值(implicitInt),找不到传默认值,没有默认值且没有隐式值,会报错:
1 | ◾could not find implicit value for parameter b: Int |
不能有多个相同类型的隐式值,否则,调用fun函数时,会报冲突的异常:
1 | ◾ambiguous implicit values: both value implicitInt in object ImplicitTest of type ⇒ Int and value implicitInt2 in object ImplicitTest of type ⇒ Int match expected type Int... |
@transient
这个注解一般用于序列化的时候,标识某个字段不用被序列化。
SerializationDemo.scala
1 | package com.dkl.scalabasic |
DeserializationDemo.scala
1 | package com.dkl.scalabasic |
运行结果:
1 | zml |
由于age被标记为@transient,在反序列化的时候,就获取不到原始值了所以被赋值为默认值。
出自:Scala基础之注解(annotation)