码迷,mamicode.com
首页 > 其他好文 > 详细

2.Scala基础

时间:2015-04-13 15:56:44      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

1.Scala REPL的使用

安装完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中摸索下就能学会了。

2.变量

在第一节中我们都是使用了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=()

3.类型

先看一张图:

技术分享

我们这次只关注红框部分。这部分对应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的方法。

4.操作符

在scala中像+、-、*、/这些操作符实际的都是方法调用,因为在scala中这些字符都是合法的标识符。

技术分享

如1+1,在scala中实际上会调用Int的+方法,最终转换为1.+(2)

在scala中只有一个参数的方法,可以写成操作符的语法,如下:

技术分享

因为to和until都是只有一个参数的方法,所以我们可以写成操作符的写法

而且操作符是有优先级的:在scala里*跟/的优先级始终大于+跟-

5.apply语法

在scala中有个apply的语法糖。具体使用规则如下:

1.如果在对象obj上直接调用obj()。那么编译器将转换为调用obj.apply()

2.如果在类clazz上直接调用clazz()。那么编译器将转换为调用clazz的伴生对象的apply方法

看如下例子:

技术分享

第六行有一个隐式转换,最终调用的是StringOps的apply方法,查看scala doc可以发现果真有这么一个方法:

技术分享

第8行其实是调用了BigInt的伴生对象的apply方法,用于生成一个BigInt的实例,我们查看scala doc,发现:

技术分享

发现BigInt类的伴生对象却是包含了很多apply方法。

 

2.Scala基础

标签:

原文地址:http://www.cnblogs.com/sysman/p/4420576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!