最近在看《七周七语言》,适当了解一些C语言家族以外的编程语言也很有意思,下面记录一下各个语言的语法特点。
首先在/etc/hosts配置 127.0.0.1 [主机名]
scala结合面向对象和函数式两种编程范型,运行在JVM上
一,scala打开交互命令行,或者scala [filename.scala]执行
// 编译期间进行类型检查 def Loop { var i = 0 while(i < args.length) { println(args(i)) i = i + 1 } for(i <- 0 until args.length) { println(args(i)) } args.foreach { arg => println(arg) } } Loop
二,范围/元组
//通过元组赋值 > val (a,b) = (1,2) a: Int = 1 b: Int = 2 > val fruits = ("apple","banana") fruits: (java.lang.String, java.lang.String) = (apple,banana) > fruits._1 java.lang.String = apple > fruits._2 java.lang.String = banana
三,并发demo
主要结构包括actor和消息传递,actor拥有线程池和队列池。当发送一条消息给actor时,是将一个对象放到该actor的队列中,actor读取消息并采取行动。
import scala.actors._ import scala.actors.Actor._ case object Poke case object Feed class Kid() extends Actor { def act() { react { case Poke => { println("aaa") act } case Feed => { println("bbb") act } case Exit => { println("exit") } } } } val bart = new Kid().start val lisa = new Kid().start bart ! Poke lisa ! Poke bart ! Feed lisa ! Feed bart ! Exit lisa ! Exit
并发获取多个网页大小测试如下:
import scala.io._ import scala.actors._ import scala.actors.Actor._ //抓取网页计算大小 object PageLoader { def getPageSize(url: String) = Source.fromURL(url).mkString.length } val urls = List("http://www.baidu.com", "http://www.sogou.com", "http://www.so.com") //计时函数 def timeMethod(method: () => Unit) = { val start = System.nanoTime method() val end = System.nanoTime println("Method took " + (end - start)/1000000000.0 + " seconds.") } def getPageSizeSequentially() = { for(url <- urls) { println("Size for " + url + " : " + PageLoader.getPageSize(url)) } } def getPageSizeConcurrently() = { val caller = self for(url <- urls) { actor { caller ! (url, PageLoader.getPageSize(url)) } } for(i <-1 to urls.size) { receive { case (url, size) => println("Size for " + url + " : " + size) } } } println("Sequential run:") timeMethod { getPageSizeSequentially } println("Concurrent run:") timeMethod { getPageSizeConcurrently } /* 执行结果如下 Sequential run: Size for http://www.baidu.com : 10219 Size for http://www.sogou.com : 6702 Size for http://www.so.com : 17476 Method took 1.476279371 seconds. Concurrent run: Size for http://www.baidu.com : 10209 Size for http://www.sogou.com : 6702 Size for http://www.so.com : 17476 Method took 0.430095069 seconds. */
总结:
1,actor模型和线程池使用非常方便,消息传递语法与erlang类似
2,可以直接使用java库
其他参考
Getting Started with Scala
构建可伸缩系统 Scala vs Java
Code Examples for
Programming in Scala
嵌入shell脚本
#!/bin/sh exec scala "$0" "$@" !# object HelloWorld { def main(args: Array[String]) { println("Hello, world! " + args.toList) } } HelloWorld.main(args)运行方式:
1,解释方式运行,源代码不能加package,(foo/bar/Hello.scala)
object Hello {
def main(args: Array[String]) {
println("Hello, world!")
}
}
$ scala foo/bar/Hello.scala
2,编译运行方式,源代码可加package,(class文件生成在源代码目录)
package foo.bar{
object Hello {
def main(args: Array[String]) {
println("Hello, world!")
}
}
}
$ scalac foo/bar/Hello.scala
$ scala foo.bar.Hello
3,编译运行方式,源代码不加package,(代码及目录同1)(class文件生成在当前目录)
$ scalac foo/bar/Hello.scala
$ scala Hello
调用java做成的jar包
//demo/Hello.java
package demo;
public class Hello {
public void Say(String name){
System.out.println("Hello "+name);
}
public static void main(String[] args) {
System.out.print("Yes");
}
}
//foo/bar/Hello.scala
import demo._;
object Hello {
def main(args: Array[String]) {
val m = new Hello();
m.Say("PJ");
println("Hello, world!")
}
}
$ javac demo/Hello.java
$ jar -cf demo.jar demo/
$ scala -cp demo.jar foo/bar/Hello.scala
Hello PJ
Hello, world!
附:命令行jar打包(指定manifest文件及指定main函数入口Main-Class: demo.Hello)如下:
jar cvfm demo.jar MANIFEST.MF demo.Hello demo