1

以下命令适用于 Ruby 1.9.3p194

> %w(a b c).grep(/a/) { |v| v.upcase }
 => ["A"] 

但是如果数组中的任何元素中有斜线,就会抛出 SyntaxError:

> %w(a/ b c).grep(/a/) { |v| v.upcase }
SyntaxError: (irb):41: syntax error, unexpected tMATCH
%Q/a// =~ /a/

我假设我使用 grep 不正确,但我得到的错误确实令人困惑。为什么会引发此错误,以及基于正则表达式在数组中查找元素的正确方法是什么?

更新:

Select 给了我我想要的东西,但我仍然很好奇 grep 是为了什么......

> %w(a/ b c).select {|v| v =~ /a/ }
=> ["a/"]
4

2 回答 2

2

原来它既不是 Ruby 也不是 Rails,而是一个名为awesome_print的 gem ,它是猴子修补 Ruby 的 grep 方法。我使用的是旧版本,它一定有一些错误。升级到最新版本 1.0.2 可解决此问题。

于 2012-08-15T01:35:42.317 回答
2

我无法重现您的错误。

起初我认为这是 IRb 的问题。众所周知,IRb 的解析器(基本上是不可维护的大杂烩Regexp)错误地解析了一些结构。此外,由于 IRb 的工作方式,Ruby 和 IRb 之间存在语义差异,尤其是局部变量和全局方法。

这就是为什么在将错误发布到此处之前,您应该始终在纯 Ruby 中重现错误。或者至少在 Pry 中尝试它,它使用 YARV、Rubinius 或 JRuby 的解析器,而不是自己滚动。

但这不是这里的情况:您的第一个代码片段在普通 Ruby 和 IRb 中都可以正常工作。

但是,即使在纯 Ruby 中运行,您的第二个代码片段也会产生您遇到的错误:

ruby -e '%Q/a// =~ /a/'
# -e:1: syntax error, unexpected tMATCH
# %Q/a// =~ /a/
#         ^
于 2012-08-15T01:29:58.703 回答