scala的基本语法(一)
一、基本语法
静态语言与动态语言区别
- 静态语言(强类型语言):静态语言是在编译时变量的数据类型即可确定的语言。多数静态类型语言要求在使用变量之前必须声明数据类型。 强类型语言是一旦变量的类型被确定,就不能转化的语言。所以即便是类型推导出的变量类型,变量也无法改变类型。如Scala C/C++ java
- 动态语言(弱类型语言):动态语言是在运行时确定数据类型的语言。弱类型语言则反之,一个变量的类型是由其应用上下文确定的。PHP Python Javascript
变量
-
val 底层等于被final 修饰,等于定义一个常量,值无法修改。线程安全的,因此效率高,推荐使用。
修饰的对象引用不可改变,但对象的状态(值)却是可以改变的。(比如: 自定义对象、数组、集合等等) 。如val buffer = new StringBuffer(),buffer.append(“a”)这样的操作来修改buffer实例也是可行的。
-
var 修饰的变量值可改变, 类型定义后不可改变。
-
Scala 支持多个变量的声明:val xmax, ymax = 100
-
变量声明时,需要初始值(显示初始化),类型可以省略(支持类型推导)。
操作符
- __ 等同Java的*
:__*
追加后, 表示参数被当做参数序列Seq处理
数据类型详解
数据类型 | 描述 |
---|---|
Byte | 8位有符号补码整数。数值区间为 -128 到 127 可通过 Byte.MaxValue查看最大值 |
Short | 16位有符号补码整数。数值区间为 -32768 到 32767 |
Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
Float | 32 位, IEEE 754 标准的单精度浮点数 |
Double | 64 位 IEEE 754 标准的双精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
Null | null 或空引用,是AnyRef下所有类型子类型。 |
Nothing | Nothing类型在Scala的类层级的最低端;是所有类型的子类。 |
Any | Any是所有其他类的超类 |
AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
字符串输出
1 .printf():类型不安全
C语言的修饰符大全
%a,%A | 浮点数、十六进制数和p-计数法(C99) |
---|---|
%c | 一个字符 |
%d | 有符号十进制数 |
%e,%E | 浮点数,e计数法 |
%f | 浮点数,十进制计数法 |
%g,%G | 根据数值不同自动选择%f或%e,%e格式在指数小于-4或者大于等于精度时使用 |
%i | 有符号十进制整数(与%d相同) |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制数 |
%x,%X | 使用十六进制数0f的无符号十六进制整数 |
%% | 打印一个百分号 |
2.字符串插值:
Scala 提供了三种创新的字符串插值方法:s,f 和 raw.以及自定义插值器
① s 字符串插值器
val name="James"
println(s"Hello,$name")//Hello,James 此例中,$name嵌套在一个将被s字符串插值器处理的字符串中。插值器知道在这个字符串的这个地方应该插入这个name变量的值,以使输出字符串为Hello,James。使用s插值器,在这个字符串中可以使用任何在处理范围内的名字。
println(s"1+1=${1+1}") //将会输出字符串1+1=2。任何表达式都可以嵌入到${}中。
②f 插值器 相当于printf 类型安全 若%后格式不对会报错
val height=1.9d
val name="James"
println(f"$name%s is $height%2.2f meters tall")//James is 1.90 meters tall f 插值器是类型安全的。如果试图向只支持 int 的格式化串传入一个double 值,编译器则会报错。例如:
val height:Double=1.9d
scala>f"$height%4d"
<console>:9: error: type mismatch;
found : Double
required: Int
③raw 插值器
除了对字面值中的字符不做编码外,raw 插值器与 s 插值器在功能上是相同的
scala>s"a\nb"
res0:String=
a
b 这里,s 插值器用回车代替了\n。而raw插值器却不会如此处理。
注意的地方:
- 默认数据类型 Int Double
- fload 小数只有7位,所以赋值的时候容易损失精度
- double 与long的底层区别:浮点数精度不准确,重要数字宜采用java.math.BigDecimal,scalad
- 由于赋值语句的值是unit类型的所以x=y=1是错误的,因为y=1的值是()
- 字符串数字不能直接转成int
val s1="12.5";println(s1.toint)//报错
val mum:Float=1+1.0 //错误
val mum:Float=1+1.0f //正确
-
++虽然不能表示自增,但可以表示一个标识符,因为底层+被翻译成$Plus, 英文变量*被翻译成$times
以"$“开头的标识符为保留的 Scala 编译器产生的标志符使用,应用程序应该避免使用”$"开始的标识符,以免造成冲突。
-
:-> 内部翻译成 $colon$minus$greater
-
在 Scala Byte字符变量使用单引号 ’ 来定义 ,’‘ 也可以跟SQL一样,加上反单引号使用内置变量名
-
编译的文件在target文件夹里,但scaladoc -d 创建帮助文档时, 要选择main里面的源文件。一定要勤写文档注释。
/**
*example:求两个值的差30 40
* @param n1 传入一个整数
* @param n1 传入第二个整数
* @return 返回差值
*/
- Scala中isInstanceOf 和 asInstanceOf
- p.isInstanceOf[XX] 判断 p 是否为 XX 对象的实例;p.asInstanceOf[XX] 把 p 转换成 XX 对象的实例
- 如果没有用isInstanceOf 先判断对象是否为指定类的实例,就直接用 asInstanceOf 转换,则可能会抛出异常;
- 如果对象是 null,则isInstanceOf 一定返回 false, asInstanceOf 一定返回 null;