Scala简单介绍整理

最近在看《七周七语言》,适当了解一些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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值