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 代码。也许我可以使用 RubyLex
或 Ripper
.
理想情况下,我很感兴趣在没有任何外部 gem 的情况下使用 Ruby 标准库。如果只针对 Ruby 2.x 版本没关系,但如果有 gem 来做这项工作,我会很乐意使用它。
既然看到了撬,就应该查其来源,吸取教训。实际上,pry 确实在内部使用了您描述的这种方法。它是:MethodSource::CodeHelpers#complete_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 代码。也许我可以使用 RubyLex
或 Ripper
.
理想情况下,我很感兴趣在没有任何外部 gem 的情况下使用 Ruby 标准库。如果只针对 Ruby 2.x 版本没关系,但如果有 gem 来做这项工作,我会很乐意使用它。
既然看到了撬,就应该查其来源,吸取教训。实际上,pry 确实在内部使用了您描述的这种方法。它是:MethodSource::CodeHelpers#complete_expression?
.