将消息发送到Scala中的函数

Chr*_*ick 5 concurrency scala actor

我正在努力通过布鲁斯泰特七周七种语言,并且很难理解他的实施sizer.scala(斯卡拉:第3天).特别是,请考虑以下Singleton对象

object PageLoader {
    def getPageSize(url : String) = Source.fromURL(url).mkString.length
}
Run Code Online (Sandbox Code Playgroud)

以及使用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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 什么是指什么?getPageSizeConcurrently?是否有可能为指功能?
  2. 假设self 确实引用了getPageSizeConcurrently,这在Scala世界中被认为是非常标准的吗?为什么要将消息发送到函数而不是对象,反之亦然?

更新:有问题的代码只使用self一次,但它确实从以下import语句开始.

import scala.io._
import scala.actors._
import Actor._
Run Code Online (Sandbox Code Playgroud)

通过寻找Scala的API,似乎Actor单对象有一个self方法.即使那是self分配的caller,但我不明白为什么receive要执行该块.

小智 4

Actor 伴随对象有一个 self 方法。来自scaladoc

返回当前正在执行的参与者。应该在参与者执行的所有代码块中使用它来代替 this。

我猜测您的代码已导入 Actor 对象,并且它是您的代码正在调用的 Actor 对象上的 self 方法。通过这种方式,您可以获得对您所在的主要参与者线程的引用,并且您开始获取页面大小的匿名参与者可以将消息发送回您所在的线程。