6

helloworld开始,我试图通过制作一个应用程序来学习一些小马,该应用程序将用户输入的内容回显给用户。这行得通,除了 I 所在的那一行_env.out.print(_buffer)

class MyInput iso is StdinNotify
  var _env: Env
  var _buffer: Array[U8]

  new iso create(env: Env) =>
    _env = env
    _buffer = Array[U8].create()

  fun ref apply(data: Array[U8] iso) =>
    for item in (consume data).values() do
      if item == 0x0A then
        _env.out.print(_buffer)
        _buffer = Array[U8].create()
      end
      _buffer.push(item)
    end

我得到的编译错误是:

argument not a subtype of parameter
        _env.out.print(_buffer)
                       ^
parameter type: ByteSeq val
  be print(data: ByteSeq) =>
           ^
argument type: Array[U8 val] ref
        _env.out.print(_buffer)   

通过阅读github中的源代码,我认为Array[U8] 应该有资格作为 ByteSeq,所以我猜这是功能的问题。我已经尝试了一些东西,但我似乎无法将我的 ref Array 复制到 val Array 中。我得到的最接近的是let out: Array[U8] box = _buffer

4

1 回答 1

4

感谢小马邮件列表和更多的试验和错误,我已经让它工作了。(感谢肖恩艾伦)

actor Main
  new create(env: Env) =>
    env.out.print("welcome to the echo chamber")

    var input = recover iso MyInput.create(env) end
    env.input(consume input)

class MyInput is StdinNotify
  var _env: Env
  var _buffer: Array[U8] iso

  new  create(env: Env) =>
    _env = env
    _buffer = recover iso Array[U8].create() end

  fun ref apply(data: Array[U8] iso) =>
      for item in (consume data).values() do
        if  item == 0x0A then
          let bufferOutIso = _buffer = recover iso Array[U8].create() end
          _env.out.print(consume bufferOutIso)
        else
          _buffer.push(item)
        end
      end

因此,如果有任何需要解释的情况,

  • 事实证明,虽然 print 要求一个val论点,它会需要一个iso,原因我不完全理解
  • 使用时iso需要了解recoverblocks和破坏性读取
  • 我把iso放在类定义中犯了一个错误,我只需要在一个recover iso块中创建实例
于 2016-02-25T08:30:00.007 回答