1

次のコマンドはRuby1.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でもないことがわかりましたが、Rubyのgrepメソッドにモンキーパッチを適用しているawesome_printと呼ばれるgemです。私はいくつかのバグがあったに違いない古いバージョンを使用していました。最新バージョン1.0.2にアップグレードすると、問題が修正されます。

于 2012-08-15T01:35:42.317 に答える
2

エラーを再現できません。

最初はIRbの問題だと思いました。IRbのパーサー(基本的には、保守不可能なRegexpダクトの寄せ集めであり、一緒にテープで留められている)が一部の構成を誤って解析することはよく知られています。また、IRbの動作方法により、RubyとIRbの間には、特にローカル変数とグローバルメソッドの場合に意味上の違いがあります。

そのため、ここに投稿する前に、エラーをプレーンRubyで常に再現する必要があります。または、少なくともPryで試してみてください。これは、独自のパーサーをロールする代わりに、YARV、Rubinius、またはJRubyのパーサーを使用します。

しかし、ここではそうではありません。最初のコードスニペットは、プレーンなRubyとIRbの両方で問題なく機能します。

ただし、2番目のコードスニペットは、プレーンなRubyで実行した場合でも、発生したエラーを生成します

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