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#match仅在返回 MatchData 对象时才会处理的块:

/(?<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 回答