ponylang-我不知道如何转换类型

Jon*_*all 5 ponylang

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
Run Code Online (Sandbox Code Playgroud)

我得到的编译错误是:

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)   
Run Code Online (Sandbox Code Playgroud)

通过阅读github中的源代码,我认为 Array [U8]应该符合ByteSeq的要求,所以我认为这是功能方面的问题。我已经尝试了一些方法,但是似乎无法将我的ref Array复制到val Array中。我最近的是let out: Array[U8] box = _buffer

Jon*_*all 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
Run Code Online (Sandbox Code Playgroud)

所以如果其中任何一个需要解释,

  • 事实证明,虽然 print 要求一个val参数,但它需要一个iso,原因我不完全理解
  • 使用时iso需要了解recover块和破坏性读
  • recover iso我犯了一个错误,将 iso 放入类定义中,我只需要在块中创建实例