每天半小时掌握Scala(day 01)

Posted 爱上终身学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天半小时掌握Scala(day 01)相关的知识,希望对你有一定的参考价值。

本文共计2768字,预计阅读时长20min



===概述===

 

scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象函数式编程的最佳特性结合在一起的静态类型编程语言

scala是纯粹的面向对象的语言。java虽然是面向对象的语言但是它不是纯粹的因为java的基本数据类型不是类并且在java中还有静态成员变量和静态方法相反scala是纯粹面向对象的每个值都是对象每个操作都是方法调用

scala也是一个成熟的函数式语言函数式编程有两个指导思想:①函数是头等值也就是说函数也是值并且和其他类型如整数字符串等处于同一地位函数可以被当作参数传递也可以被当作返回值返回还可以在函数中定义函数等等;②程序的操作应该把输入值映射为输出值而不是就地修改也就是说函数调用不应产生副作用虽然函数式编程语言鼓励使用无副作用的方法但是scala并不强制你必须这么做。scala允许你使用指令式的编程风格但是随着你对scala的深入了解你可能会更倾向于一种更为函数式的编程风格向函数式编程转变你就应该尽量去使用val、不可变对象无副作用方法而不是var、可变对象有副作用方法要明白的是从指令式编程向函数式编程的转变会很困难因此你要做好充分的准备并不断的努力

scala运行于JVM之上并且它可以访问任何的java类库并且与java框架进行互操作,scala也大量重用了java类型和类库

 

第一个scala程序

    object ScalaTest {

        def main(args: Array[String]) {

            println("hello scala.")

        }

    }

 

===scala解释器===

 

安装好scala并配置好PATH环境变量之后就可以在终端中输入“scala”命令打开scala解释器在其中你可以像使用shell一样使用TAB补全、Ctrl+r搜索上下方向键切换历史命令等等退出scala解释器可以使用命令:“:q”或者“:quit”。

由于解释器是输入一句执行一句因此也常称为REPL。REPL一次只能看到一行代码因此如果你要在其中粘贴代码段的话可能会出现问题这时你可以使用粘贴模式键入如下语句

:paste

然后把代码粘贴进去再按下Ctrl+d,这样REPL就会把代码段当作一个整体来分析

 

===scala作为脚本运行===


scala代码也可以作为脚本运行只要你设置好代码文件的shell前导词(preamble),将代码文件设置为可执行如下

#!/usr/bin/env scala

println("这是scala脚本")

设置代码文件为可执行即可执行之啦

scala脚本的命令行参数保存在名为args的数组中你可以使用args获取命令行输入的程序参数

 

===scala编译运行=== 

scala编译器scalac(scala compiler)会将scala代码编译为jvm可以运行的字节码然后就可以在jvm上执行了假设有一个Hello.scala 文件我们就可以使用 scalac Hello.scala 编译然后使用 scala Hello 运行当然也可以使用java工具来运行但需要在classpath里指定scala-library.jar。对于classpath,Unix家族的系统上类路径的各个项目由冒号“:”分隔MS Windows系统上它们由分号“;”分隔例如linux上你可以输入这样的命令来运行注意classpath最后加一个“.”):

java -classpath /usr/local/scala-2.10.4/lib/scala-library.jar:. Hello

 

===scala IDE开发环境===

 

你可以使用 eclipse 或者 intellij idea 作为scalaIDE开发环境但都需要安装scala插件才行下面分别介绍这两种方式

 

eclipse开发环境配置

 

我们先安装eclipse juno,然后下载eclipse juno以及scala 2.10.4对应的scala sdk插件升级包:update-site.zip。将插件解压缩 features  plugins 目录下的所有东东都复制到eclipse中的对应目录中重启eclipse即可然后就可以新建scala project

 

intellij idea开发环境配置

 

我们先安装好intellij idea,然后安装scala插件自动安装插件有时会非常慢尤其是在china。我们还是手动配置插件吧请注意插件的版本必须与当前idea版本兼容手动配置插件方法如下

(2) 解压插件压缩包把插件的全部文件都复制到IntelliJ IDEA安装程序的plugins文件夹中注意插件最好以一个单独的文件夹放在plugins目录下

(3) 一般重启intellij idea就会自动加载插件进入 setting > plugins 看看有木有如果不自动加载的话进入setting > plugins > install plugin from disk,找到刚才复制的插件位置再然后就好了

接下来就可以新建scala project,新建时我选择的是“Scala”(不是sbt,因为我这选择sbt之后等半天sbt都不会配置好郁闷啊)。

 

相关姿势

什么是SBTSBT = (not so) Simple Build Tool,scala的构建工具javamaven地位相同其设计宗旨是让简单的项目可以简单的配置而复杂的项目可以复杂的配置

 

===scala特点===

 

scala语句之后的“;”是可选的这根据你的喜好当有多个语句在同一行时必须加上分号但不建议把多个语句放在一行

scala建议使用2个空格作为代码缩进不过我咋喜欢一个tab ⊙﹏⊙!

scala符号“_”相当于java中的通配符“*”。

scala类似于c++、java,索引也是从0开始但元组是个例外它从1开始

 

===数据类型===

 

scala7种数值类型ByteCharShortIntLongFloatDouble以及2种非数值类型BooleanUnit只有一个值“()”,相当于javac++中的void,即空值)。这些类型都是抽象的final(不能使用new新建也不能被继承),scala包中定义是对java基本数据类型的包装因此与java基本数据类型有相同的长度同时,scala还提供了RichInt、RichChar等等它们分别提供Int、Char等所不具备的便捷方法

另外,scala沿用了java.lang包中的Stringscala常量也称作字面量字符串字面量由双引号包含的字符组成同时scala提供了另一种定义字符串常量的语法——原始字符串它以三个双引号作为开始和结束字符串内部可以包含无论何种任意字符

scala我们使用方法而不是强制类型转换来做数值类型之间的转换99.44.toInt、97.toChar。另外也可以参见显式类型转换和隐式转换


===变量===

 

scala有两种变量valvar。val如同java中的final变量,var如同java中的非final变量由于scala是完全面向对象的因此valvar只是声明了对象的引用是不可变的还是可变的并不能说明引用指向的对象的可变性声明变量的同时需要初始化之否则该变量就是抽象的如果不指定变量的类型编译器会从初始化它的表达式中推断出其类型当然你也可以在必要的时候指定其类型但注意scala中变量或函数的类型总是写在变量或函数的名称的后边示例如下

val answer = “yes”

val answer, message: String = “yes”

 

===标识符===

 

scala标识符有四种形式字母数字标识符操作符标识符混合标识符字面量标识符

 

字母数字标识符跟其他语言类似由字母数字和下划线组成但需注意“$”字符被保留作为scala编译器产生的标识符之用你不要随意使用它啊

操作符标识符由一个或多个操作符字符组成。scala编译器将在内部粉碎操作符标识符以转换成合法的内嵌“$”java标识符若你想从java代码中访问这个标识符就应该使用这种内部表示方式

混合标识符由字母数字以及后面跟着的下划线和一个操作符标识符组成unary_+定义了一个前缀操作符“+”。

字面量标识符是用反引号`…`包含的任意字符串,scala将把被包含的字符串作为标识符即使被包含字符串是scala的关键字例如你可以使用Thread.`yield`()来访问java中的方法即使yieldscala的关键字

 

===操作符===

 

scala的操作符和你在javaC++中的预期效果是一样的但注意scala并不提供++、--操作符不过scala中的操作符实际上都是方法任何方法都可以当作操作符使用 a + b 相当于 a.+(b)。

需要注意的是对于不可变对象(对象的不可变并不是说它的引用变量是val),并不真正支持类似于“+=”这样以“=”结尾的操作符(即方法),不过scala还是提供了一些语法糖用以解释以“=”结尾的操作符用于不可变对象的情况假设a是不可变对象的引用那么在scalaa += b将被解释为a = a + b,这时就相当于新建一个不可变对象重新赋值给引用a,前提是引用变量a要声明为var因为val变量定义之后是不可变的

更多信息参见函数方法部分

 

===块表达式与赋值===

 

scala{}包含一系列表达式其结果也是一个表达式块中最后一个表达式的值就是其值

scala赋值语句本身的值是Unit类型的因此如下语句的值为“()”:

{r = r * n; n -= 1}

正是由于上述原因scala中不能多重赋值javac++却可以多重赋值因此scala如下语句中的x值为“()”:

x = y = 1 




每天18:00向你推送最实用的干货,欢迎关注~

点击这里查看往期精彩内容:




以上是关于每天半小时掌握Scala(day 01)的主要内容,如果未能解决你的问题,请参考以下文章

每天半小时掌握Scala(day 04)

每天半小时掌握Scala(day 03)

自动化快速上手--Python--元组--每天半小时

5个能够改变一生的自学网站,每天半小时效果看的见!

linux学习之路每天半小时

每天半小时下班的公交车上,把html5学完了...