ponylang - 我不知道如何转换类型
ponylang - I can't figure out how to convert type
从 helloworld 开始,我试图通过制作一个应用程序来学习一些小马,该应用程序可以向用户回显他们输入的内容。这行得通,除了我 _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 数组复制到 val 数组中。我得到的最接近的是 let out: Array[U8] box = _buffer
感谢小马邮件列表和更多的试验和错误,我让它工作了。 (感谢肖恩·艾伦)
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
时,需要理解recover
块和destructive read
- 我把 iso 放在 class 定义中是错误的,我只需要在
recover iso
块中创建实例
从 helloworld 开始,我试图通过制作一个应用程序来学习一些小马,该应用程序可以向用户回显他们输入的内容。这行得通,除了我 _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 数组复制到 val 数组中。我得到的最接近的是 let out: Array[U8] box = _buffer
感谢小马邮件列表和更多的试验和错误,我让它工作了。 (感谢肖恩·艾伦)
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
时,需要理解recover
块和destructive read - 我把 iso 放在 class 定义中是错误的,我只需要在
recover iso
块中创建实例