Scala入门Ⅰ

Scala入门Ⅰ

    因为游戏要做压力测试,用scala写机器人http://www.scala-lang.org/ http://www.ibm.com/developerworks/cn/java/j-scala/ 
    http://download.scala-ide.org/
     Scala程序设计:Java虚拟机多核编程实战
     Scala编程
   《Programming Scala》
  《Programming in Scala》
    目前参考Scala编程电子版-书籍已购买
  学习方法:首先看一下基础知识,然后结合robot,遇到不会的地方查询书籍或者网络
     关于Scala的函数式编程-
    函数式编程有两种指导理念,第一种理念是函数是第一类值。在函数式语言中,函数也是值,与整数或字符串处在同一个地位。函
数可以被当作参数传递给其他函数,可以当作结果从函数中返回或保存在变量里。可以在函数里定义其他函数,就好像在函数里定
义整数一样。还可以定义匿名函数,并随意地插入到代码的任何地方。
 函数式编程的第二种理念是程序的操作应该把输入值映射为输出值而不是就地修改数据。如,在Java 和Scala 里,字符串是一
种数学意义上的字符序列。使用s.replace(';', '.')这样的表达式替换字符串里的字符会产生一个新的,不同于原字符串s 的对象。换句
话说就是在Java 里字符串是不可变的,(immutable)而在Ruby 里则是可变的。因此单就字符串来说,Java 是函数式的语言,而Ruby
不是。不可变数据结构是函数式语言的一块基石。
     函数式编程第二种理念的另一种解释是方法不应有任何副作用(side effect)。方法与其所在环境交流的唯一方式应该是获得
参数和返回结果。比如Java 里String 类的replace 方法就符合这种说法。它的参数包括一个字符串和两个字符,返回的是一个新的字
符串,其中的指定字符都替换成另一个。调用replace 不会有其他的结果。类似于replace 这样的方法被称为指称透明
(referentially transparent),就是说对于任何输入来讲,都可以用方法的结果替代对它的调用,而不影响程序的语义。

1.去http://www.scala-lang.org/下载scala发布包,scala-2.9.1.final.zip,解压,bin目录下有scala.bat-解释器批处理文件。学习习Scala 最简单的方
法就是使用Scala 解释器,它是编写Scala 表达式和程序的交互式“shell”。只要在解释器里输入表达式,它就能计算并打印结果值。
Scala 的交互式shell 就叫做scala。(或者将scala的bin目录加到path中,然后就可以在cmd中运行scala,输入scala -version可以查看版本)
2.Int 类型指代了scala 包的类Int,类Int 的值对应着Java 的int 值。从更广泛意义上来说,所有的Java 原始类型在scala 包里都有对应的类。
例如,scala.Boolean 对应着Java 的boolean。scala.Float 对应着Java 的float。在把Scala 代码编译成Java 字节码的时候,Scala 编译器会
代以使用Java 的原语类型以便优化性能。
3.println 函数在标准输出上打印传给它的字符串,就跟Java 里的System.out.println 一样。
4.Scala 有两种变量,val 和var。val 类似于Java 里的final 变量。一旦初始化了,val 就不能再被赋值。相反,var 如同Java 里面的非final
变量,可以在它的生命周期中被多次赋值。
 如scala> val msg = "Hello, world!"
     msg: java.lang.String = Hello, world!
 这个语句引入了msg 作为字符串"Hello, world!"的名字。它的类型是java.lang.String,因为Scala 的字符串是由Java 的String 类实现。
5.写明类型标注不但可以确保Scala 编译器使用你想要用的类型,还可以有助于之后代码的阅读。Java 的变量类型写在名称之前,相
反,Scala 的变量类型在其名称之后,用冒号分隔。
 如:scala> val msg2: java.lang.String = "Hello again, world!"
 在Scala 程序里java.lang 类型的简化名4也是可见的,
 如:val msg3: String = "Hello yet again, world!"
由于msg 不是var 类型变量,因此唯一不能做的就是再给它赋值,否则编译器报错-error: reassignment to val
 如果需要的是可以被重新赋值的变量,你应该使用var
在解释器中跨行输入语句的话,只要一行行写进去即可。如果输到行尾还没结束,解释器将在下一行回应一个竖线(按回车即可)。
 scala> val multiLine =
  | "This is the next line."
 如果你发现了一些错误而解释器仍在等着更多的输入,你可以通过按两次回车取消掉
 scala> val oops =
  |
  |
 You typed two blank lines. Starting a new command.
6.函数定义-
 scala> def max(x: Int, y: Int): Int =
 {
  if (x > y) x
  else y
 }
 max: (Int,Int)Int
    函数的定义以def 开始。然后是函数名,本例中是max,跟着是括号里带有冒号分隔的参数列表。函数的每个参数都必须带有前缀冒
号的类型标注,因为Scala 编译器(以及解释器,但之后我们将只说编译器)无法推断函数的参数类型。在max 参数列表的括号之后
你会看到另一个“: Int”类型标注。这是max 函数的结果类型(result type)定义。跟在函数结果类型之后的是一个等号和一对包含了函
数体的大括号。
 Scala 的条件表达式可以像Java 的三元操作符那样生成结果值。例如,Scala 表达式“if(x > y) x else y”可以与Java 的“(x > y) ? x : y”产
 生同样的结果。
    函数大括号前的等号可以提示我们,按照函数式编程的风格来看,函数是对能产生值的表达式的定义。
 既不带参数也不返回有用结果的函数定义:
 scala> def greet() = println("Hello, world!")
 greet: ()Unit
函数greet()定义之后,解释器输出返回greet: ()Unit。“greet”当然是函数名,空白的括号说明函数不带参数。Unit 是greet 的结果类型,
指的是函数没有有效的返回值。Scala 的Unit类型比较类似于Java 的void 类型,而且实际上Java 里返回void 的方法都会被映射为返回
Unit的Scala 方法。因此结果类型为Unit 的方法,并非是为了得到返回值,而是为了其他的运行效果(side effect)。greet()的例子里,效
果就是在标准输出上打印一句话。
 如果想要离开解释器,输入:quit 或者:q。
7.编写Scala脚本:
 脚本就是一种经常会被执行的放在文件中的句子序列。
 把以下代码放在hello.scala 文件中:
 println("Hello, world, from a script!")
 然后运行:
 $ scala hello.scala
 于是系统又会输出:Hello, world, from a script!
Scala 脚本的命令行参数保存在名为args 的Scala 数组中。Scala 里,数组以零开始,可以通过在括号里指定索引值来访问数组元素。
Scala 里数组steps 的第一个元素是steps(0),而不是像Java那样的steps[0]。
 // 向第一个参数打招呼
 println("Hello, " + args(0) + "!")
 然后运行:$ scala helloarg.scala planet
 这个脚本包含了一条注释。Scala 编译器忽略从//开始到行尾截止的以及在/*和*/之间的字符。本例还演示了String 使用+操作符
 的连接。
     注:1.因为现在已经开始编写脚本了,所以决定采用eclipse的scala插件;org.scala-ide.sdt.update-site。装上后回弹出Setup
 Diagnostics->修改eclipse.ini中-Xmx和-Xms,默认推荐的Xmx是1024m,不过那样eclipse可能都无法启动,failed to create the java virtual
 machine ,因为分配的内存过大。
  2.如何执行脚本:目录问题。将scala放到c盘,然后将其bin目录放到path中。然后根目录中新建一个script目录,这个目录用
  来存放执行的一些脚本。若执行这些脚本,则需进入控制台,cd到script目录,然后输入scala命令执行即可。
  3.eclipse开发scala和java差不多,多多尝试即可。
8.用while 做循环;用if 做判断
 var i = 0
 while (i < args.length)
 {
  println(args(i))
  i += 1
 }
 注:请注意Java 的++i 和i++在Scala 里不起作用,要在Scala 里得到同样效果,必须要么写成i = i + 1,要么写成i += 1
 var i = 0
 while (i < args.length)
 {
  if (i != 0)
   print(" ")
  print(args(i))
  i += 1
 }
 println()
 新版本里,print 调用替代了println 调用,这样参数就可以在同一行里输出;注意Scala 和Java 一样,必须把while 或if 的布尔表达式
 放在括号里;尽管Scala 也和Java 一样用分号分隔语句,但是Scala 的分号经常是可选的,因此你的右小手指可以不用那么累。不
 过如果你喜欢,也可以把所有可选部分都加上。
9.用foreach 和for 做枚举
前一步里写的while 循环的编码风格被称为是指令式(imperative)编程。这种风格常见于Java,C++和C 这些语言,或者逐条执行指
令,或者循环枚举,并经常改变不同函数之间的共享状态。Scala 里允许使用指令式的编程风格,但随着你对Scala 的深入了解,你
可能会发现自己逐渐倾向于一种更为函数式(functional)的编程风格。
 函数式语言的主要特征之一就是,函数是第一类结构,而这也正是Scala 的主要特征。举例来说,另一种更为简洁的打印每
个命令行参数的方法是:
 args.foreach(arg => println(arg))
 args.foreach((arg: String) => println(arg))
这行代码对args 调用了foreach 方法,并把函数作为参数传入,在这里是名为arg 的函数文本(function literal)。函数体是println(arg)
 综上,函数文本的语法构成包含,括号及命名参数列表,右箭头以及函数体
 (x: Int, y: Int) => x + y

 for (arg <- args)
 println(arg)
例子中“for”之后的括号包含arg<-args。<-右侧的是已经在前面见过的args 数组。<-左侧的“arg”,是val 的名称(不是var)。(这里一
定是val,因此只写arg 即可,无需写成val arg。)尽管arg 可能感觉像var,因为每次枚举都会得到新的值,但这的确是val,因为它不
能在for表达式的函数体中被重新赋值。所以,对于args 数组的每个元素,枚举的时候都会创建并初始化新的arg 值,然后调用执行
for 的函数体。

10.下面开始学习robot,遇到不会的问题再查找书籍或网络

 1.scalac/scala
 2.下载ant http://www.apache.org/dist/ant
 3.Intellij IDEA/netbeans的scala插件/eclipse的scala插件

1.1 Array -类型参数化数组
 class-类
 Object-Scala不能定义静态成员,代之定义单例对象(singleton object)
1.2 -> 左右两边代表一个映射关系,类似map的k-v键值对
1.3 trait-特质
1.4 =>
1.5 import com.mop.sgz.core.config._
1.6 Actor 和并发
1.7_
1.8 scala中避免使用显示的return,因为这样会影响到scala推演返回类型的能力;如-
 def check1() = true
 def check2() : Boolean = return true
 对于使用了return的方法,就需要显示的提供返回类型,否则会有编译错误

你可能感兴趣的:(Scala入门Ⅰ)