res1,res2,... res5等分别表示输出结果。若一次计算输出的结果被标识为res2,那么在之后的调用中,可以直接使用res2。
例:
Scala IDE 中的 Scala WorkSheek
这是Scala IDE提供的非常有用的功能。其功能就相当于Scala REPL。可以动态的将结果显示出来。
输出通常使用print或println函数。
输入通常使用read函数。
readLine是从控制台读取一行输入。指定类型时为readT,T是所要指定的类型,如readInt等。
例:
val name=readLine("Your name :\n") val age=readInt()
在Scala中,几乎所有的语言元素都是表达式。
可以通过val定义一个常量,亦可以通过var定义一个变量。推荐多使用常量。Scala中应该尽量使用函数式编程的特性。尽量多使用val。
val x1,x2,x3 等价于 val x1;x2;x3
var x1,x2,x3:T = e // 等价于 var x1:T = e var x2:T = e var x3:T = e
Scala中,函数体的最后一行,即为整个函数体的值。
def func(x1:T1,x2:T2):T = e
若返回类型确定,所以不需要声明函数返回值类型。
def func(x1:T1,x2:T2) = e
若定义的函数没有参数,则可以省略掉函数的括号。
def func() = e // 等价于 def func = e
例:定义max函数与min函数。
例:定义add函数与max函数。
说明:scala没有"? :"三元运算符。
return 语句表示返回某个值,但是Scala事实上无须使用return语句。对于函数来说,其默认返回值是最后出现的一个值,不用特别注明。
如需要返回的值并非最后出现时,可在函数体后加上该值的标识符使之"出现"。
声明函数时使用return语句,必须声明返回值的类型。
例:
def abd():T={return}
每个Scala程序都必须从一个对象的main方法开始,这个方法的类型为Array[String] => Unit:
object Basic { def main(args : Array[String]){ // 主方法 println("hello world!") } }
另一种方法是使用App特质。
object Basic extends App{ // 主方法 println("hello world!") }
与Java一致。即使用:// 与 /* */
{ } 块包含一系列的表达式。最后一个表达式的值,即整个块语句的值。
Scala的if/else语法结构和Java或C++一样。
if(A) B if(A) B else C
说明:A可以是任意返回布尔值的语句,或是布尔值的量,真则执行B,假则执行C;
例:求最小值的函数。
def min(x:Int,y:Int):Int={ var a=x if(x>y) a=y return a }
Scala可以大大减小代码量:
if表达式可以用以赋值。
def min(x:Int,y:Int)= if(x>y) y else x
原:
def main(args: Array[String]){ var file = "scala.txt" if (! args.isEmpty) file = args(0) println(file) }
改进:
def main(args: Array[String]){ val file = if (! args.isEmpty) args(0) else "scala.txt" println(file) }
scala的while与Java中的一样。
while语句包括状态判断与循环体,只要当前状态判断为真,就执行循环体一遍;然后
进行下一次状态判断,判断为假时终止循环。
while(A) B
例:
var m=3 while(m!=0){ println(m) m-=1 }
do语句与while相反,先执行循环体一遍,然后进行状态判断,状态判断为真,则继续
执行循环体,否则终止循环。
do B while(A)
例:
var m=3 do{ println(m) m-=1 }while(m!=0)
scala的for语句与Java的不太一样。
for表达式能用任意条件进行各种形式枚举,而在枚举的过程中能实现绝大部分的循环功能且不必使用变量。
for(i <- e) E(i)
for表达式包括发生器(i <- e),函数体E(i) 。
发生器是遍历e中的元素,每一次枚举名为i的新的val就被初始化。对于每一次枚举,函数体E(i)都会执行一次,而其中的参数i由枚举时进行赋值。
e可以是各种集合,包括数组、列、表达式等,或是有上下界的数值范围:
1 to 4 即表示:1=<i<=4;
1 until 4 (1=<i<=4-1)(不包含上界)
例:
for(i<- 1 to n) r = r*i for(i <- 1 to 4) if(i%2==0) if(i!=2) println("No."+ i)
说明:to 实际上是1的一个方法。1 to 10 等价于 1.to(10)
for(i<- 1.to(n)) r = r*i
Java等语言嵌套for语句都需要使用多个for语句。
for(i<-e1) for(j<-e2) E(i,j)
for语句实现嵌套只需要多加入一个<-子句。
for(i<-e1;j<-e2)E(i,j)
例:
for(i<- 1 to 3; j<-1 to 3) print((10*i + j)+" ")
每个生成器都可以带一个守卫,for语句中可以直接嵌入if表达式。
for(i<-e1;if A;j<-e2;if B)E(i,j)
例:
for(i<- 1 to 3; j<-1 to 3 if i != j) print((10*i + j)+" ")
注意:if之前可以没有分号,也可以有分号。
以下写法都是一样的:
for(i <- 1 to 100 if i%2==0) println(i) for(i <- 1 to 100; if i%2==0) println(i) for(i <- (1 to 100);if(i%2==0)) println(i)
例:可以使用任意多的定义,引入可以在循环中使用的变量:
for(i<- 1 to 3; from = 4-i; j<- from to 3) print((10*i + j)+"")
for语句除了对枚举值进行操作并释放该值外,可以用以赋值,即把每一次枚举的值记录在集合中。
for(i <- e) yield E(i)
若E(i)由花括号括起,yield须在花括号外。
for(i <- e) yield {E(i)}
例:这样被赋值的x为一个序列类型。
val x= for(i <- 1 to 4) yield i
REPL中返回如下结果
x: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4)
即x被赋值为一串序列。
for推导式生成的集合与第一个生成器是类型兼容的。
例:
for(c<-"HELLO"; i<- 0 to 1) yield (c + i).toChar // 返回 res0: String = HIEFLMLMOP for(i<-0 to 1; c<- "HELLO") yield (c+i).toChar // 返回res1: scala.collection.immutable.IndexedSeq[Char] = Vector(H, E, L, L, O, I, F, M, M, P)
Scala没有没有break语句和continue语句。Scala内置控制结构特地去掉了break和continue,是为了更好的适应函数化编程。
例:以下Java代码实现的功能是从一组字符串中寻找以".scala"结尾的字符串,但跳过以"-"开头的字符串。
int i=0; boolean foundIt=false; while(i <args.length) { if (args[i].startWith("-")) { i=i+1; continue; } if(args[i].endsWith(".scala")){ foundIt=true; break; } i=i+1; }
Scala中一般使用如下方法实现break。
1. 使用boolean型的控制变量。
例:下面使用if和boolean变量,逐句将这段实现使用Scala来实现(不使用break和continue)如下:
var i=0 var foundIt=false while (i < args.length && !foundIt) { if (!args(i).startsWith("-")) { if(args(i).endsWith(".scala")) foundIt=true } i=i+1 }
2. 使用递归函数。(依然不建议return语句)
在函数化编程中使用递归函数来实现循环是非常常见的一种方法。
使用递归函数重新实现上面代码实现的查询功能:
def searchFrom(i:Int) : Int = if( i >= args.length) -1 else if (args(i).startsWith("-")) searchFrom (i+1) else if (args(i).endsWith(".scala")) i else searchFrom(i+1) val i = searchFrom(0)
3. 使用Breaks对象中的break方法。
若还是希望使用break,Scala在scala.util.control包中定义了break控制结构。它的实现是通过抛出异常给上级调用函数。
例:下面给出使用break的一个例子,不停的从屏幕读取一个非空行,如果用户输入一个空行,则退出循环。
import scala.util.control.Breaks._ import java.io._ val in = new BufferedReader(new InputStreamReader(System.in)) breakable { while(true) { println("? ") if(in.readLine()=="") break } }
原文:http://www.cnblogs.com/shijiaqi1066/p/4604161.html