七周七语言:Scala Day 1
之前由于期末考试各种预习、复习所以在Prolog之后停顿了好久,寒假开始又有时间可以慢慢看书了:)
Scala 是一门基于JVM的静态类型语言,支持面向对象和函数式编程,twitter在前几年也从Ruby转向了Scala,Scala的效率可见一斑。整个过程下来感觉Scala和Java还是有比较大的区别的(具体可以看下文以及附带的链接)。最后完成了一个可以玩的tic-tac-toe,由于对Scala的不熟悉,还是耽搁了一段时间。
-
Scala的API
-
对比Java和Scala
联系:Scala有着和Java相同的编译模型并且可以调用Java的库;Scala工作特征和Java几乎一致;Scala编译产生的字节码与Java编译产生的几乎一致(事实上,Scala的代码可以编译成可读的Java代码);对于JVM而言,两者是没有区别的(唯一的区别就是一个附加的库:scala-library.jar),etc.
区别:Scala拥有更小的代码体积与更小的内存占用;Scala的语法相比Java更为灵活(如无分号等);Scala在Java的面向对象之上提供了“函数式编程”的实现;一切都是表达式,即在Scala语言中不再有表达式和赋值语句之分,etc.
更多有关Scala与Java之间的关系和区别可以参考:wikipedia.以及Google对于集中语言的对比:addr
-
val 与 var
"val means immutable and var means mutable."--赋值给val的对象不能被其他值替代而var的则可以。
关于这个问题,stackoverflow上有一个hot的讨论:addr -
Scala Tic-Tac-Toe
看完一天的内容,在做这个小游戏的时候还是感觉对这门语言很生疏。比如经常遇到一些之前没有预料到的问题,比如List和Array的问题,包含没有实现的函数需要抽象化类的问题,函数定义时的“=”问题等等。
class Game { //initialize the Game Table var table = Array( "_", "_", "_", "_", "_", "_", "_", "_", "_" ) //0 for going and 1 for winning var gameState = 0 //define two kinds of pieces in the game val piece = List("X", "O") //0 for "X" to play and 1 for "O" to play var player = 0 var currentPiece = -1 //print information for users and read the choose def choose() { if ( this.player == 0) { println("X's move(0~8):") } else { println("O's move(0~8):") } currentPiece = Console.readInt(); } def validMove ():Boolean = { if(this.table(currentPiece) == "_") { return true } else { return false } } def setPiece() { if ( this.player == 0) { this.table(currentPiece) = "X" } else { this.table(currentPiece) = "O" } } //judge the game def judger() { if( (table(0) != "_" && table(0) == table(1) && table(0) == table(2)) || (table(3) != "_" && table(3) == table(4) && table(3) == table(5)) || (table(6) != "_" && table(6) == table(7) && table(6) == table(8)) || (table(0) != "_" && table(0) == table(3) && table(0) == table(6)) || (table(1) != "_" && table(1) == table(4) && table(1) == table(7)) || (table(2) != "_" && table(2) == table(5) && table(2) == table(8)) || (table(0) != "_" && table(0) == table(4) && table(0) == table(8)) || (table(2) != "_" && table(2) == table(4) && table(2) == table(6))) { gameState = 1 } } def hasFinished():Boolean = { this.judger() if ( this.gameState == 1 ) { if (this.player == 1) { println("O win!") } else { println("X win!") } return true } else { return false } } //print game table def printTable() { println(table(0) + "|" + table(1) + "|" + table(2)) println(table(3) + "|" + table(4) + "|" + table(5)) println(table(6) + "|" + table(7) + "|" + table(8)) } //main function for play def play() { this.printTable() while(!this.hasFinished) { this.choose() while( !this.validMove()){ println("INVALID MOVE!") this.choose() } this.setPiece() this.printTable() if( player == 0) { player = 1 } else { player = 0 } } } } var game = new Game() game.play()