标签:
安装完scala,并且把scala安装目录的bin目录追加到PATH环境变量。这时就可以直接在cmd下输入scala进入REPL
进入REPL,在命令提示符后面可以输入scala中合法的表达式。例如我们输入8*5+2
上面的res0就是保存表达式结果的变量,Int代表表达式结果的数据类型
再比如:下面简单定义了一个scala中的函数字面量实现两个数的加法
在上面的例子中,res6代表函数字面量对应的函数值(函数字面量可以类比为类,出现在源码中,函数值类比为对象,
出现在运行时。(Int,Int)=>Int代表的是结果的类型(实际为Function2[Int,Int,Int])。
上述出现的res0和res6都可以用于后续表达式中,如:求两个数的商
scala的repl环境可以使用tab键进行命令补全,可以使用上下箭头键来前后翻阅命令历史。如下:
我们在字符串"Hello"上调用方法,但是不记得方法名了(或者怕自己把方法名写错了)可以打如前一部分的方法名,
然后按下tab按键就会出现符合条件的方法,我们接着敲入C,再按tab就会把方法补全了。返回了字符串的字符数组
当然RHEL还内置了很多比较好用的命令,通过敲入:help可以查看到底内置了哪些命令
这些命令都比较简单。自己在REPL中摸索下就能学会了。
在第一节中我们都是使用了REPL自动生成的变量名,如res0,res6等。大多数情况下我们需要自定义变量名。
在Scala中有两种类型的变量:可变类型的变量-用var声明;不变类型的变量-用val声明
例如,我们使用var声明一个变量:mvp当前保存有今年的全明星mvp-威斯布鲁克
等常规赛打完,mvp很可能就是库里的了。所以到时候我们可以重新赋值mvp,如下:
细心的读者可能已经注意到了,我们在定义mvp的时候,并没有给定mvp的数据类型(这在java中必定会报错的)
但是Scala中却可以正常运行。这是因为scala中有类型推断的机制。在大多数情况下都能够推断出变量的类型。上述代码中
我们直接把字符串赋值给了mvp,显然mvp是String类型。
当然我们可以手动指定变量的类型,虽然这显得有点多次一举。指定变量的类型可以按照如下方式进行:
上述代码我们也没有在语句的末尾加入分号。其实在scala中语句末的分号也是可选的。除非你在一行中书写多条语句时才必
需在语句末尾加上分号。
对于不可变类型,我们可以用val来声明变量,如下:
上述代码我们声明了一个val的变量answer并对它进行赋初值。如果后续代码对answer变量再次赋值就会报错。
最后说一下scala跟java中在一个赋值语句中给多个变量赋值方式的区别。先看JAVA
在JAVA中如果我们想给x,y都赋值为10,上述语法会报错。因为在JAVA中上述赋值只会为y赋值。
在JAVA中我们可以通过如下方式给x,y都赋值为10
而在scala,我们首先试试val x,y=10试试
从运行结果看出,在scala中可以在同一行中对多个变量声明和赋初值
scala中再试试val x=y=10:
从运行结果可以看出在这一点上scala也会报错,出错原因也是y1没有声明。那么我们声明y1,继续运行这条语句
上述结果非常有意思,下面我们来逐句分析:
第一句var y1=11。声明y1并赋值
关键在于第二句val x1=y1=10。这条语句scala会做拆分,首先y1=10把10赋给y1,重点在于赋值语句在scala中
的返回值为Unit(跟Java中不同)。所以才会导致最终y1=10,x1=()
先看一张图:
我们这次只关注红框部分。这部分对应JAVA中的基本数据类型(原始类型)。虚线代表可以进行隐式转换。
在scala中是没有原始类型的。即便是Int,Double这种也都是引用类型。
例如我们可以对数字调用方法,比如把数字和字符串互相转换,在java中我们需要这么做:
在java中这种转换还是有点烦杂。下面我们看下scala中是如何完成字符串跟数字的互转的。
可以看到scala中这种转换是非常简单的。也是比较符合人们的正常思维的。
我们首先看下第六行:因为在scala中i是Int类型的引用类型,又重载了toString方法,所以可以i.toString
再来看看第七行:scala中的String就是重用了java中的String,然后通过隐式转换又给String增加了很多
功能。我们点击第七行前面的图标,可以查看应用的隐式转换,如下:
也就是说str_i.toInt是StringOps的方法。所以在日后的学习过程中如果用到String的某个方法,但是该方法并
没有定义在String上,这时候不要忘记了去查询下StringOps的方法
另外在Java中我们做类型转型的时候经常用到强制类型转换,如:
在第七行中我们通过强制类型转换把double类型转换成了int类型。
在scala中这些类型之间的转换都是通过方法来操作的,如下:
在上述第六行代码中我们通过Double类型提供的toInt方法把Double转换成了Int
在上述学习过程中我们知道StringOps类给String类提供了很多易用的方法。其实在scala中的数值类型,比如Int
Double等也都有RichInt,RichDouble通过隐式转换给其增加了很多易用的方发,比如to方法
上述的to方法就是RichInt的方法。
在scala中像+、-、*、/这些操作符实际的都是方法调用,因为在scala中这些字符都是合法的标识符。
如1+1,在scala中实际上会调用Int的+方法,最终转换为1.+(2)
在scala中只有一个参数的方法,可以写成操作符的语法,如下:
因为to和until都是只有一个参数的方法,所以我们可以写成操作符的写法
而且操作符是有优先级的:在scala里*跟/的优先级始终大于+跟-
在scala中有个apply的语法糖。具体使用规则如下:
1.如果在对象obj上直接调用obj()。那么编译器将转换为调用obj.apply()
2.如果在类clazz上直接调用clazz()。那么编译器将转换为调用clazz的伴生对象的apply方法
看如下例子:
第六行有一个隐式转换,最终调用的是StringOps的apply方法,查看scala doc可以发现果真有这么一个方法:
第8行其实是调用了BigInt的伴生对象的apply方法,用于生成一个BigInt的实例,我们查看scala doc,发现:
发现BigInt类的伴生对象却是包含了很多apply方法。
标签:
原文地址:http://www.cnblogs.com/sysman/p/4420576.html