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

Scala基础01:语法基础入门

时间:2015-06-27 17:59:37      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

 

Scala REPL

技术分享

res1,res2,... res5等分别表示输出结果。若一次计算输出的结果被标识为res2,那么在之后的调用中,可以直接使用res2。

 

例:

技术分享

 

 

Scala IDE 中的 Scala WorkSheek

这是Scala IDE提供的非常有用的功能。其功能就相当于Scala REPL。可以动态的将结果显示出来。

 

 

输入输出

输出通常使用printprintln函数。

输入通常使用read函数。

readLine是从控制台读取一行输入。指定类型时为readT,T是所要指定的类型,如readInt等。

例:

val name=readLine("Your name :\n")
val age=readInt()

 

 

表达式和值

在Scala中,几乎所有的语言元素都是表达式。

  • println("hello wolrd") 是一个表达式。
  • "hello"+" world" 也是一个表达式。

 

声明与定义

可以通过val定义一个常量,亦可以通过var定义一个变量。推荐多使用常量。Scala中应该尽量使用函数式编程的特性。尽量多使用val。

val 常量声明
  • 将x声明为类型T  val x:T
  • 将x声明为类型T,并赋值。  val x:T = e  (备注 e表示一个表达式)
var 变量声明
  • 将x声明为类型T  var x:T
  • 将x声明为类型T,并赋值  var x:T = e

 

类型省略
  • val x = e
  • var x = 3

 

声明省略

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

 

 

def 函数声明

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语句

return 语句表示返回某个值,但是Scala事实上无须使用return语句对于函数来说,其默认返回值是最后出现的一个值,不用特别注明。

如需要返回的值并非最后出现时,可在函数体后加上该值的标识符使之"出现"。

声明函数时使用return语句,必须声明返回值的类型。

例:

def abd():T={return}

 

 

main方法

每个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控制语句

条件表达式

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)
}

 

 

循环(while/do)

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)

 

 

for循环

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

 

 

高级for循环

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语句除了对枚举值进行操作并释放该值外,可以用以赋值,即把每一次枚举的值记录在集合中。

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)

  

 

break/continue语句

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
  }
}

 

Scala基础01:语法基础入门

标签:

原文地址:http://www.cnblogs.com/shijiaqi1066/p/4604161.html

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