在Ruby中使用带有安全导航操作符的[]

时间:2016-01-14 16:28:08

标签: ruby

我目前有一段代码如下:

if match = request.path.match(/\A\/(?<slug>(?!admin|assets)\w+)/)
  match[:slug]
end

有没有办法使用安全导航操作符(在2.3.0中引入)来避免这种if条件?

4 个答案:

答案 0 :(得分:19)

只需使用普通(非糖)形式。

request.path.match(/\A\/(?<slug>(?!admin|assets)\w+)/)&.[](:slug)

答案 1 :(得分:7)

为了更好的可读性,我会选择#dig而不是#[]

像,

request.path.match(/\A\/(?<slug>(?!admin|assets)\w+)/)&.dig(:slug)

而不是

request.path.match(/\A\/(?<slug>(?!admin|assets)\w+)/)&.[](:slug)

答案 2 :(得分:3)

出于可读性考虑,我更喜欢使用红宝石1.9.1中提供的匹配项named_captures方法和红宝石2.3.0中提供的safe operator方法。

request.path.match(/\A\/(?<slug>(?!admin|assets)\w+)/)&.named_captures&.dig('slug')

答案 3 :(得分:2)

你可以send任何方法,所以使用安全浏览操作符,这将是:

request.path.match(/\A\/(?<slug>(?!admin|assets)\w+)/)&.send(:[], :slug)