0

次の作業コードを検討してください。

md = nil
begin
    puts md[:c]
    break
end if md = /(?<c>string)/.match('some string')

しかし、それは一種の醜いように見えます。か否か?私はこれから始めました:

puts c if /(?<c>string)/ =~ 'some string'

しかし、変数が表示されなかったcので、次のように置きました。

puts md[:c] if md = /(?<c>string)/.match('some string')

そして最後に追加すると、機能md = nilし始めました。普段はこれをどのようにしていますか?私はそれを間違っていますか?ここで何が起こっているのですか?

4

2 に答える 2

4

Regexp#matchMatchData オブジェクトが返された場合にのみ処理されるブロックを渡すだけです。

/(?<c>string)/.match('some string') {|m| puts m[:c]}
于 2014-05-24T14:49:20.230 に答える
3

最も簡単な方法も最善だと思います。

if md = /(?<c>string)/.match('some string')
  puts md[:c]
end

ifワンライナーで引き続き修飾子を使用したい場合は、各一致の後に設定された特別なグローバル変数を使用できます。

puts $~[:c] if /(?<c>string)/ =~ 'some string'

または

puts $1 if /(string)/ =~ 'some string'
于 2014-05-24T13:36:10.510 に答える