scala的基本语法(一)

一、基本语法

静态语言与动态语言区别

  1. 静态语言(强类型语言):静态语言是在编译时变量的数据类型即可确定的语言。多数静态类型语言要求在使用变量之前必须声明数据类型。 强类型语言是一旦变量的类型被确定,就不能转化的语言。所以即便是类型推导出的变量类型,变量也无法改变类型。如Scala C/C++ java
  2. 动态语言(弱类型语言):动态语言是在运行时确定数据类型的语言。弱类型语言则反之,一个变量的类型是由其应用上下文确定的。PHP Python Javascript

变量

  • val 底层等于被final 修饰,等于定义一个常量,值无法修改。线程安全的,因此效率高,推荐使用。

    修饰的对象引用不可改变,但对象的状态(值)却是可以改变的。(比如: 自定义对象、数组、集合等等) 。如val buffer = new StringBuffer(),buffer.append(“a”)这样的操作来修改buffer实例也是可行的。

  • var 修饰的变量值可改变, 类型定义后不可改变。

  • Scala 支持多个变量的声明:val xmax, ymax = 100

  • 变量声明时,需要初始值(显示初始化),类型可以省略(支持类型推导)。

操作符

  • __ 等同Java的*
  • :__* 追加后, 表示参数被当做参数序列Seq处理

数据类型详解

在这里插入图片描述

数据类型描述
Byte8位有符号补码整数。数值区间为 -128 到 127 可通过 Byte.MaxValue查看最大值
Short16位有符号补码整数。数值区间为 -32768 到 32767
Int32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float32 位, IEEE 754 标准的单精度浮点数
Double64 位 IEEE 754 标准的双精度浮点数
Char16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String字符序列
Booleantrue或false
Unit表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Nullnull 或空引用,是AnyRef下所有类型子类型。
NothingNothing类型在Scala的类层级的最低端;是所有类型的子类。
AnyAny是所有其他类的超类
AnyRefAnyRef类是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;
posted @ 2019-12-01 12:00  曲水修竹  阅读(52)  评论(0编辑  收藏  举报