Ruby 如何获得if修饰符';s变量?

Ruby 如何获得if修饰符';s变量?,ruby,control-structure,Ruby,Control Structure,考虑以下工作代码: md = nil begin puts md[:c] break end if md = /(?<c>string)/.match('some string') 最后,当我添加md=nil时,它开始工作了。你通常是怎么做的?我做错了吗?这里发生了什么?我相信最直接的方法也是最好的: if md = /(?<c>string)/.match('some string') puts md[:c] end 或 只需将一个块传递给Reg

考虑以下工作代码:

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

最后,当我添加
md=nil
时,它开始工作了。你通常是怎么做的?我做错了吗?这里发生了什么?

我相信最直接的方法也是最好的:

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


只需将一个块传递给
Regexp#match
,仅当返回MatchData对象时才会处理该块:

/(?<c>string)/.match('some string') {|m| puts m[:c]}
/(?string)/.match('some string'){| m | put m[:c]}

不妨这样做,然后:
如果/(?string)/=~'some string';把c;结束
?实际上,似乎无法使用if修饰符,所以建议使用if语句语法。你不可能说修饰符是无用的吗?@x-yuri-
如果修饰符远非无用,那么它们是很棒的构造。问题是在这一行之前没有定义
md
,这意味着解释器被搞糊涂了。这样,当定义
md
时,对解释器(和读者)来说是显而易见的。您使用
c
的建议是错误的,因为您没有在任何地方定义变量
c
。您可以使用match期间自动创建的变量-我将使用该选项发布问题的更新。尽管您提出了一种有趣的表达方式,但能否详细说明使用if修饰符语法?你是在建议你的变体,因为if修饰符语法太冗长,超过了使用if修饰符语法的好处?@x-yuri这是关于风格和个人喜好的。相反,使用if条件语法并没有什么错,但是当以完整的形式编写时,它会变得不那么简单,而且会变得更加冗长,也就是说,函数式编程中使用else部分是一种很好的做法-表达式应该始终返回一个值。@x-yuri还有一个优点,我使用block的版本不会污染objectspace,例如,
m
变量是块的局部变量,不会与当前命名空间中的变量
m
发生冲突。
if md = /(?<c>string)/.match('some string')
  puts md[:c]
end
puts $~[:c] if /(?<c>string)/ =~ 'some string'
puts $1 if /(string)/ =~ 'some string'
/(?<c>string)/.match('some string') {|m| puts m[:c]}