主构造函数
class Car(val name:String , age:Int){
val id = age;
val sname = name;
def this(name:String) = this(name,1);
}
<span style="font-family: Arial, Helvetica, sans-serif;">val car1 = new Car("wang",1)</span>
val car2 = new Car("xun")
println(car1.name)
println(car2.age) //error 在age 前加 val 或var 即可
伴生对象
class Car(val name : String){
val idd = 1
override def toString() = {
val name = "car "
name + idd
}
}
object Car{
var id = 1;
def show(name:String) = println(name);
def apply(name : String)={
println("create")
new Car(name)
//if name.empy() null else new Car(name) 则不能调用car.idd 因为存在null的情况
}
}
协变
class fruit{
override def toString() = "fruit"
}
class banana extends fruit{override def toString() = "banana"}
class apple extends fruit{override def toString() = "apple"}
def sail(fruits:Array[fruit]){
for(f <- fruits)
println(f)
}
val fruits = Array(new apple(),new banana()) //ok fruis type is Array[fruit]
sail(fruits)
val fruits = Array(new apple(),new apple) //error fruis type is Array[apple]
sail(fruits)
将sail 改为
def sail(fruits:Array[fruit]){
for(f <- fruits)
println(f)
}
def sail2[T <: fruit](fruits:Array[T]){
for(f <- fruits)
println(f)
}
//ok
偏应用函数
def print1(month:String, date: String){
println( month + " " + date )
}
val da = print1("12 " ,_:String)
da("34")
</pre><pre code_snippet_id="450410" snippet_file_name="blog_20140814_10_3315719" name="code" class="java">借贷模式(loan)
def write2File(name:String)(codeblock:PrintWriter => Unit){
val writer = new PrintWriter(new File(name))
try{
codeblock(writer)
}
finally{
writer.close()
}
}
write2File("output.txt"){writer => writer write "hello "}
</pre><pre code_snippet_id="450410" snippet_file_name="blog_20140814_16_4326022" name="code" class="java">
</pre><pre code_snippet_id="450410" snippet_file_name="blog_20140814_16_4326022" name="code" class="java">
</pre> <p></p><p></p><p><pre name="code" class="java">actors模型
package com.xunw
import scala.actors.Actor.actor
import scala.actors.Actor.receive
import scala.actors.Actor.sender
object Hello extends App {
// Spawn Consumer
val consumer =
actor
{
var done = false
while (! done)
{
receive
{
case msg =>
System.out.println("MESSAGE RECEIVED: " + msg)
println(Thread.currentThread().getName())
done = (msg == "DONE")
sender! "RECEIVED"
}
}
}
// Spawn Producer
val importantInfo : Array[String] = Array(
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too",
"DONE"
);
importantInfo.foreach((msg) => consumer !?msg)
}
</pre><pre code_snippet_id="450410" snippet_file_name="blog_20140815_16_6681474" name="code" class="java">和主线程通信
package com.xunw
import scala.actors.Actor.actor
import scala.actors.Actor.receive
import scala.actors.Actor.sender
import scala.actors.Actor.{mailboxSize,self}
object Hello extends App {
def sumInRange(lower:Int,upper:Int,number:Int){
(0 /: (lower to upper)){(sum,i) => if(number % 2 ==0) sum+i else sum}
}
val startTime :Long = 0
val caller = self
val eActor = actor{
println("num received" + mailboxSize)
caller ! "send"
Thread.sleep(3000)
receive{
case massage => println(System.currentTimeMillis() - startTime)
}
caller ! "hello main"
}
receive{
case _=> println("got")
}
eActor ! "hello eActor "
receive{
case msg => println(msg)
}
}
package com.xunw
import scala.actors.Actor
import scala.actors.Actor.{ sender, receive, mailboxSize, self }
class AService(folks: String*) extends Actor {
def act() {
while (true) {
receive {
case (caller: Actor, name: String, msg: String) =>
caller ! {
if (folks.contains(name))
String.format("%s got msg %s", name, msg)
else
String.format("this no one called %s", name)
}
case "quit" =>
println("exit actor")
exit
}
}
}
}
object Hello extends App {
val as = new AService("wang","yu")
as ! (self,"wang","back")
Thread.sleep(3000)
as.start()
as ! (self,"wan","back")
as ! (self,"yu","haha")
as ! (self,"quit")
for(i <- 1 to 3)
receive{
case msg => println(msg)
}
println("over")
}
//receiveWithin
package com.xunw
import scala.actors.Actor
import scala.actors.TIMEOUT
import scala.actors.Actor.{ sender, receive, mailboxSize, self ,receiveWithin,exit}
class AService(folks: String*) extends Actor {
def react() {
var sum = 0
for(i <- 1 to 4) {
sum += receiveWithin(2000) {
case TIMEOUT => {
println("time out")
0
}
case a:Int =>
{println(sum)
Thread.sleep(1000)
a
}
case (caller:Actor,"sum") =>
caller ! sum
0
}
println("heer")
}
}
}
object Hello extends App {
val as = new AService("wang","yu")
as !1
as !2
as !"fdsf"
as ! (self,"sum")
as.start()
println("over")
//exit
// receiveWithin(5000){
// case sum:Int => println("sum is" + sum)
// case TIMEOUT => println("time out")
// }
}
//react
package com.xunw
import scala.actors.Actor
import scala.actors.TIMEOUT
import scala.actors.Actor.{ actor,sender, receive, mailboxSize, self ,receiveWithin,exit,react}
object Hello extends App {
def info(msg:String) = println( msg +" reveived by " + Thread.currentThread())
def reactMsg(id :Int) {
react{
case msg => info("react" + id + msg)
reactMsg(id)
}
}
val acts = Array(
actor{info("react: 1 actor create"); reactMsg(1);},
actor{info("react: 2 actor create"); reactMsg(2);}
)
for(i <- 0 to 1){
acts(i) ! "hello " ;Thread.sleep(3000)
}
for(i <- 0 to 1){
acts(i) ! "world " ;Thread.sleep(3000)
}
}