Ruby在调用方法之前检查是否为nil

use*_*388 40 ruby null

我在Ruby中有一个字符串,我正在调用strip方法来删除前导和尾随空格.例如

s = "12345 "
s.strip
Run Code Online (Sandbox Code Playgroud)

但是,如果字符串为空,我会收到以下错误.

NoMethodError:nil的未定义方法`strip':NilClass

我正在使用Ruby 1.9,那么在调用strip方法之前,最简单的方法是检查值是否为nil?

更新:

我在数组中的元素上尝试了这个但是遇到了同样的问题:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip
Run Code Online (Sandbox Code Playgroud)

use*_*951 82

Ruby 2.3.0添加了一个安全的导航操作符(&.),它在调用方法之前检查nil.

s&.strip
Run Code Online (Sandbox Code Playgroud)

nil如果snil,它将返回,而不是提高NoMethodError.

  • 我第一次看到这个 - 非常有用 (2认同)
  • @JosephK `nil` (或 `null`)被称为,除其他外,[计算机科学中最严重的错误](https://www.lucidchart.com/techblog/2015/08/31/the-worst-计算机科学错误/)。 (2认同)

meg*_*gas 15

您可以使用tryActiveSupport中的方法(Rails库)

gem install activesupport

require 'active_support/core_ext/object/try'
s.try(:strip)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用我的gem tryit,它提供额外的设施:

gem install tryit

s.try { strip }
Run Code Online (Sandbox Code Playgroud)


Mic*_*ohl 10

如果您不介意创建额外的对象,则可以使用以下任一方法:

"#{s}".strip
s.to_s.strip
Run Code Online (Sandbox Code Playgroud)

没有额外的对象:

s && s.strip
s.strip if s
Run Code Online (Sandbox Code Playgroud)


luk*_*kad 7

我想最简单的方法如下:

s.strip if s
Run Code Online (Sandbox Code Playgroud)

  • 如果你尝试连锁东西不太方便. (2认同)

Eug*_*ene 0

简单的说:

s = s.nil? ? s : s.strip
Run Code Online (Sandbox Code Playgroud)

Tl;dr 检查 s 是否为零,然后返回 s,否则剥离它。