Я прорабатываю Семь языков за семь недель Брюса Тейта , и мне сложно понять его реализацию sizer.scala
] (Scala: День 3). В частности, рассмотрим следующий объект Singleton
object PageLoader {
def getPageSize(url : String) = Source.fromURL(url).mkString.length
}
и следующий метод, который с помощью субъектов вычисляет количество символов на каждой веб-странице, заданной массивом 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)
}
}
}
getPageSizeConcurrently
? Может ли self ссылаться на функцию? getPageSizeConcurrently
, считается ли это довольно стандартным в мире Scala? Зачем отправлять сообщения функции, а не объекту, или наоборот? ОБНОВЛЕНИЕ: В рассматриваемом коде self используется только один раз, но он начинается со следующего import
.
import scala.io._
import scala.actors._
import Actor._
Просматривая API Scala , выясняется, что одноэлементный объект Actor
имеет метод self
. Даже если это self
, назначенный вызывающему
, тем не менее, я не понимаю, почему блок получения
будет выполняться.