Я работаю над книгой Брюса Тейта Семь языков за семь недель. и мне трудно понять его реализацию 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)
}
}
}
- К чему относится self?
getPageSizeConcurrently
? Может ли self ссылаться на функцию? - Предполагая, что self делает ссылку на
getPageSizeConcurrently
, считается ли это довольно стандартным в мире Scala? Зачем отправлять сообщения функции, а не объекту или наоборот?
ОБНОВЛЕНИЕ: рассматриваемый код использует self только один раз, но он начинается со следующих операторов import
.
import scala.io._
import scala.actors._
import Actor._
Просматривая API Scala, оказывается, что объект Actor
singleton имеет self
метод. Даже если это self
назначено caller
, я не понимаю, почему должен выполняться блок receive
.
getPageSizeConcurrently
в качестве одного из своих методов? - person Rex Kerr   schedule 19.07.2011urls
) здесь, но в остальном это дословно из книги. Единственный класс или объект, объявленный в коде, — этоPageLoader
, как показано выше. - person Chris Frederick   schedule 19.07.2011