Ruby REPL,确定一行是否是有效表达式的一部分

Ruby REPL, determinate if a line it's part of a valid expression

我正在做一个 Ruby REPL(只是一个爱好,不会像 pry 那样大而专业)。

我写了一个非常简单的 REPL,如果输入只是 Ruby:

的单个有效行,它就可以正常工作
loop do
  print "ruby> "
  input = gets
  puts "=> #{eval(input)}"
end

我想支持多行输入。

我正在考虑的一种方法是检查每个输入行的代码是否为正确的 Ruby 表达式、Ruby 表达式的一部分或无效代码。

valid_expression?("def foo; end") # => true, complete expression
valid_expression?("def foo")      # => true, partial expression
valid_expression?("def ::foo")    # => false

无论如何,我试图理解其他实现1,2,3 但实际上是 difficult/undocumented 代码。也许我可以使用 RubyLexRipper.

理想情况下,我很感兴趣在没有任何外部 gem 的情况下使用 Ruby 标准库。如果只针对 Ruby 2.x 版本没关系,但如果有 gem 来做这项工作,我会很乐意使用它。

既然看到了撬,就应该查其来源,吸取教训。实际上,pry 确实在内部使用了您描述的这种方法。它是:MethodSource::CodeHelpers#complete_expression?.