我正在尝试使用Ruby的Fibers创建一个REPL,其中一个Fiber充当前端 - 输入并显示输出 - 一个Fiber作为后端 - 处理来自前端的输入并返回输出以供显示。
(我这样做的部分是因为我模糊地需要一个REPL,部分是因为我想了解Fibers,部分是因为我认为这将允许测试 - 只需替换测试框架中的前端来测试后端,而副-versa)。
麻烦的是,我找不到关于如何实际使用完整的Fibers库的任何好的文档,我的初步猜测不起作用。所以,我有四个问题:
Enter a string:
,并反复接受输入;但每次我提供一行输入时,它只会显示反转的第一个输入行(包括样本输出,如果不清楚的话)。代码:
require 'fiber'
# Simple REPL. Echo back the user's input, reversed, until they
# enter "pots" (resulting in "stop")
frontend = Fiber.new do |backend, output|
while output != 'stop' do
puts output
print ": "
input = gets
output = backend.transfer(frontend, input)
end
end
backend = Fiber.new do |frontend, input|
loop do
frontend.transfer(input.reverse)
end
end
frontend.transfer(backend, "Enter a string:")
输出:
Enter a string:
: Hello
olleH
: World
olleH
:
答案 0 :(得分:1)
答案,按顺序:
没有。查看您的REPL,仅使用方法编写:
def repl(output, &backend)
input = nil
while output != "stop"
puts output
print ': '
input = gets.chomp
output = backend.call(input)
end
end
repl("Enter a string: ") {|input| input.reverse}
哪个输出:
Enter a string:
: Hi
iH
: Hello
olleH
: Bork
kroB
完美无缺。
当您多次调用transfer
或resume
时,参数仅在第一次传递到光纤块时。因此,每当您调用transfer
时,支持的光纤仍然会反转它传递的第一个字符串,因为它从未获得另一个字符串。这就是光纤实现这一点的错误原因。