1

我正在尝试使用 Ruby 的 Fibers 创建一个 REPL,其中一根 Fiber 作为前端 - 接收输入并显示输出 - 一根 Fiber 作为后端 - 处理来自前端的输入并返回输出以供显示。

(我这样做部分是因为我隐约需要一个 REPL,部分是因为我想了解 Fibers,部分是因为我认为这将允许测试 - 只需替换测试框架中的前端来测试后端,反之亦然) .

麻烦的是,我找不到任何关于如何实际使用完整的 Fibers 库的好的文档,而且我最初的猜测是行不通的。所以,我有四个问题:

  1. 这是一个半明智的想法吗?尝试从 Fibers 制作 REPL 时我会遇到巨大的麻烦吗?
  2. 如果没有 Fibers 库,我认为我无法做到这一点,因为我需要双向传递值。那正确吗?
  3. 任何人都可以指出关于 Ruby Fibers 的体面的、入门的教程或文档(如在库中,而不是单向生成器的东西)?
  4. 为什么以下不起作用?正确显示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
:
4

1 回答 1

1

答案,按顺序:

  1. 纤维对此是错误的。光纤是一个非常高级的特性,用于协作并发。将它们用于由函数和块覆盖的简单用例是没有意义的。
  2. 不。查看您的 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
    

    完美运行。

  3. Ruby 自己的文档:http ://ruby-doc.org/core-2.0.0/Fiber.html

  4. 当您调用transferresume多次时,参数仅在第一次传递给光纤块。因此,每次调用transferbacked fiber 时,它仍然会反转它通过的第一个字符串,因为它从来没有得到过另一个。这就是为什么纤维在实现这一点时是错误的。

于 2013-10-03T14:50:26.530 回答