scala学习笔记(1)

我认为有必要首先说明一下自己学scala的最初目的:
伯克利推出了riscv后,全球掀起了一片开源CPU的热潮,为了跟风,当然首先要去看看伯克利出的rocket了。rocket这个东西就是以scala写成的(好吧,其实是chisel,一个scala硬件库,至少我是这么看它 的),那就得先看看scala了。
一看不要紧,立马被scala这个神奇的语言吸引住了。
scala继承了java的简单和java的所有包(众所周知java有海量的乱七八糟的各种包),要实现某个复杂功能的时候完全可以先去想想有没有相对应的别人已经写好了的java包,直接拿来import就好了。甚至连我这个java黑都不得不否认java的简单通俗。
另外,除去完美的面向对象性质外,scala还具备函数式编程的性质,就好像lisp和Erlang那样。函数与字面量、变量等等统统属于一等公民,在函数调用的时候直接传递的函数作为参数而不是指针了,清晰易懂且扩展性强。另外,其无副作用(side effect)的性质使得找bug变得更加容易。

安装什么的全部略过,官网上说的很清楚。我采取的编译方式是在apt源里面加上scala安装路径后直接apt install的(我是Ubuntu系统),直接用vim进行编写。同时顺便在idea里面加上了scala插件,不过只用了一次,大部分时候还是vim简洁些。

简单说一下印象比较深的一些地方:

1.scala的变量与C/C++什么的不太一样。

val hello: string = "Hello World!"

可以看到,它的变量类型写在冒号后面(嗯,注意,在scala里面“冒号”的地位举足轻重)。此外,语句最后的分号也是可选项(在idea里面如果你写了分号它会给你警告)。上面写的这个val是不可变的,相当于C++里面的const或者是java里的final,这也是scala所推荐的。与之对应的是可变的var,不是说var不能用,而是要酌情、少用。

2.函数的定义参照上面的变量定义也就不难想象出来:

def main(args: Array[String]): Unit = {
xxx
}

这个是标准的主函数(即入口函数),以”def”开头,以”:”+返回值类型结尾。其中Unit指的是空类型,相当于void了。

3.一切的一切都是对象
scala是非常标准的面向对象型语言:哪怕像是`1+2这种都是值为”1”的Int型对象调用了’+’方法,并把Int对象”2”传递给’+’方法,等同于(1).+(2)。基于这个认识,当我们看到类似于args.foreach(arg => println(arg))也就感觉非常正常了吧。这是说args调用了foreach方法并把函数println作为参数传入。变量arg没有预先定义吗?嗯,是的,其默认定义为val了。
上面这句的标准形式是:args.foreach((arg: String) => println(arg)),更简略的写法的args.foreach(println),完全看个人的书写习惯了。
与之类似的:

for (arg <- args)
   println(arg)

同样arg是默认val(在《scala编程》中提到:arg“这里一定是val,因此只写arg即可,无需写成val arg”,“这的确是val,因为它不能在for表达式的函数体中被重新赋值。所以,对于args数组的每个元素,枚举的时候都会创建并初始化新的arg值,然后调用执行for的函数体”。顺便吐槽一句这本书的翻译版中小错误不少,还有错别字。可怜我校木有英文原版orz)。

4.Array、List、Tuple、Set、Map
这些形如C++容器的对象在scala里面用起来都非常相似。以Array为例:

val myNumber = Array(1, 2, 3)

其他的四个里面:Tuple不用写“Tuple”,直接括号就行;Map还是键值对;其余的只是把“Array”改成对应的容器名即可。
其中Array与List的区别是“尽管数组在实例化之后长度固定,但它的元素值却是可变的。所以说数组是可变的。至于不可变的同类对象序列,Scala的列表类(List)才是”。简单说就是把上面的myNumber改成var的,那么Array中元素的值可变;但是把Array换成List,那么哪怕是var也不可变。这个我亲测过,大家可以自己写写试下。
另外书中写到Tuple出现的原因是为了创建包含不同类型的容器,可事实上我试过在Array、List、Set中同样可以创建不同类型的元素。我猜可能是版本不同的原因吧。
个人感觉比多余的一个东西是Set和Map的import问题。他俩都有,以Set为例,immutable.Set、mutable Set、immutable HashSet、mutable HashSet,当然Map是对应的。通过英文就看出来他们是为了确定容器是否可变,事实上他们的优先级比val和var高。也就是说,如果import了一个mutable.Set之后哪怕val Set,那么这个Set也可变。(总之就是感觉又麻烦又没用)

5.与写脚本不同的是,运行独立的scala程序需要有main:

object Hello {
   def main(args: Array[String]) {
         xxx
      }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值