build.sbt:
name := "ContinuationSandwich"
version := "0.1"
scalaVersion := "2.11.6"
autoCompilerPlugins := true
addCompilerPlugin(
"org.scala-lang.plugins" % "scala-continuations-plugin_2.11.6" % "1.0.2")
libraryDependencies +=
"org.scala-lang.plugins" %% "scala-continuations-library" % "1.0.2"
scalacOptions += "-P:continuations:enable"
CTest.scala:
import scala.util.continuations._
object CTest extends App {
case class Sandwich()
def makeSandwich = {
println("Making sandwich")
new Sandwich
}
var k1 : (Unit => Sandwich) = null
reset {
shift { k : (Unit => Sandwich) => k1 = k }
makeSandwich
}
val x = k1()
}
То, что по сути делает код выше, вызывает Функция makeSandwich (в запутанном виде). Таким образом, результатом выполнения будет просто печать «Создание бутерброда» в консоли. Тот же результат будет достигнут без продолжений:
object CTest extends App {
case class Sandwich()
def makeSandwich = {
println("Making sandwich")
new Sandwich
}
val x = makeSandwich
}
Теперь пошагово. k1 - переменная для хранения указателя на функцию, которая должна позволять «создавать сэндвич». Мы знаем это, потому что k1 объявлено так: (Unit => Sandwich)
. Однако изначально переменная не инициализирована (k1 = null
, «пока нет ингредиентов для приготовления бутерброда»). Поэтому мы пока не можем вызвать функцию, готовящую бутерброд с использованием этой переменной.
Таким образом, мы отмечаем точку выполнения, в которую мы хотим вернуться (или точку в прошлом, в которую мы хотим вернуться), используя инструкцию «reset». makeSandwich - это еще один указатель на функцию, которая позволяет создавать сэндвич. Это последнее утверждение «сброса блока», и, следовательно, оно передается «shift» (функции) в качестве аргумента (shift { k : (Unit => Sandwich)...
. Внутри shift мы присваиваем этот аргумент переменной k1 k1 = k
, таким образом, делая k1 готовым для вызова в качестве функции) После этого мы возвращаемся к точке выполнения, отмеченной сбросом. Следующим оператором является выполнение функции, на которую указывает переменная k1, которая теперь должным образом инициализирована, поэтому в конце мы вызываем makeSandwich, который выводит на экран консоль «Making sandwich». класс сэндвича, который присваивается переменной x.
Я не был слишком уверен в том, что было Вашей проблемой, таким образом, я экспериментировал немного.
Кажется, что Вы просто пропустили это для присвоения ссылки на объект, необходимо использовать set
, даже для возвращаемого значения:
Function GetSomeStuff
Dim stuff
Set stuff = CreateObject("Scripting.Dictionary")
stuff.Add "A", "Anaconda"
stuff.Add "B", "Boa"
stuff.Add "C", "Cobra"
Set GetSomeStuff = stuff
End Function
Set d = GetSomeStuff
Wscript.Echo d.Item("A")
Wscript.Echo d.Exists("B")
items = d.Items
For i = 0 To UBound(items)
Wscript.Echo items(i)
Next
Вы попытались делать set GetSomeStuff = stuff
в последней строке функции?
Имейте Вас попробованный:
Dim returnedStuff
Set returnedStuff = GetSomeStuff()
Затем "Для Каждой" итерации по словарю? Существует пример использования Словаря (хотя для VB6, суть его является тем же хотя!) здесь.