【发布时间】:2011-07-19 06:36:27
【问题描述】:
我正在研究 Bruce Tate 的 Seven Languages in Seven Weeks,我很难理解他对 sizer.scala 的实现(Scala:第 3 天)。特别是考虑下面的 Singleton 对象
object PageLoader {
def getPageSize(url : String) = Source.fromURL(url).mkString.length
}
下面的方法使用actors计算urls数组给出的每个网页中的字符数。
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)
}
}
}
-
self指的是什么?
getPageSizeConcurrently? self 是否可以引用函数? - 假设 self 确实 引用
getPageSizeConcurrently,这在 Scala 世界中被认为是相当标准的吗?为什么要将消息发送到函数而不是对象,反之亦然?
更新:有问题的代码只使用了一次 self,但它确实以以下 import 语句开头。
import scala.io._
import scala.actors._
import Actor._
查看the Scala API,似乎是the Actor singleton object has a self method。即使这是分配给caller 的self,但我不明白为什么会执行receive 块。
【问题讨论】:
-
哪个类或对象将
getPageSizeConcurrently作为其方法之一? -
@Rex 没有,据我所知。我在这里省略了一些其他方法(以及
urls的定义),但除此之外,这是书中逐字记录的。代码中唯一声明的类或对象是PageLoader,如上图。
标签: scala concurrency actor