2012-08-15 24 views
1

在Ruby中1.9.3p194爲什麼Array#grep用斜槓引發語法錯誤?

> %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不正確,但我得到的錯誤是非常混亂。爲什麼會拋出這個錯誤,以及基於正則表達式在數組中找到元素的正確方法是什麼?

更新:

選擇給我我想要的,但我還是好奇的grep是...

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

適用於Ruby 1.8.7。你使用什麼版本? – 2012-08-15 01:15:24

+0

我正在使用1.9.3p194 – 2012-08-15 01:15:48

+0

Gah它是Rails控制檯中的東西,它正在破壞它! irb工作正常:( – 2012-08-15 01:22:27

回答

2

原來這既不紅寶石也不Rails的,但是寶石叫awesome_print這是猴子修補Ruby的grep方法。我使用的是舊版本,它一定有一些bug。升級到最新版本1.0.2可解決此問題。

+0

我在版本0.3.2上,不知道修正版何時發佈。 – 2012-08-15 01:38:48

+0

我的天啊。非常感謝指出th有問題的寶石名稱。我知道grep方法是重新定義的,但不能真正找出它被重新定義的地方。 – Dingle 2013-05-22 04:02:03

2

我無法重現你的錯誤。

起初我以爲這是IRB的問題。衆所周知,IRB的解析器(它基本上是一個不可維護的輸入管道),不正確地解析了一些構造。另外,由於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/ 
#  ^
+0

感謝您的迴應,但問題其實與[awesome_print](https://github.com/michaeldv/awesome_print/blob/master/lib/awesome_print/core_ext/array.rb#L33-70 )濫用紅寶石,我應該很久以前去掉那顆寶石,現在我付出的代價是:( – 2012-08-15 01:31:40

+0

我的眼睛!我的眼睛! – 2012-08-15 01:35:09

+0

@Beerlington用Pry代替! – 2012-08-15 01:36:32

相關問題