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

Kyl*_*cot 17 ruby

我目前有一段代码如下:

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

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

saw*_*awa 31

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

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

  • 我认为 `&amp;.[](:slug)` 部分是我做错的。我之前一直在尝试 `&amp;.[:slug]` (3认同)
  • @KyleDecot是的,这就是我对`[]`位的意思,虽然我觉得看起来很可怕. (2认同)

ved*_*ant 7

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

喜欢,

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

代替

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

  • 有趣的想法,但我得到"未定义的方法'挖掘'匹配数据",即使使用ruby 2.4.2和rails 5.1.4. (3认同)
  • 挖掘方法适用于哈希.虽然它也适用于数组,但看起来MatchData并没有完全实现数组接口.由于安全导航操作员像#try一样工作!而不是#try,只有第二个版本有效./sf/answers/3207784891/ (2认同)

小智 5

为了提高可读性,我更喜欢使用ruby 1.9.1中提供的match的named_captures方法,以及ruby 2.3.0中可用的安全运算符

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