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

时间:2012-09-14 13:22:42

标签: ruby null

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

s = "12345 "
s.strip

但是如果字符串为空,则会出现以下错误。

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

11 个答案:

答案 0 :(得分:73)

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

s&.strip

如果nils,则会返回nil,而非提出NoMethodError

答案 1 :(得分:15)

您可以使用ActiveSupport(Rails库)

中的方法try
gem install activesupport

require 'active_support/core_ext/object/try'
s.try(:strip)

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

gem install tryit

s.try { strip }

答案 2 :(得分:9)

如果你不介意创建额外的对象,其中任何一个都可以工作:

"#{s}".strip
s.to_s.strip

没有额外的对象:

s && s.strip
s.strip if s

答案 3 :(得分:7)

我想最简单的方法如下:

s.strip if s

答案 4 :(得分:2)

ActiveSupport附带了一种方法:try。例如,如果an_object.try :strip为零,则nil将返回an_object,否则将继续。语法与send相同。 Cf active_support_core_extensions.html#try

答案 5 :(得分:1)

适用于我的方法(我知道,我绝不应该污染原始的Object空间,但这样做很方便,我会承担风险):

class Object
  def unless_nil(default = nil, &block)
    nil? ? default : block[self]
  end
end

p "123".unless_nil(&:length) #=> 3
p nil.unless_nil("-", &:length) #=> "-"

在您的特定情况下,它可能是:

data[2][1][6].unless_nil { |x| x.split(":")[1].unless_nil(&:strip) }

答案 6 :(得分:1)

如果您想避免问题中出现的错误:

s.to_s.strip

答案 7 :(得分:1)

要完成此处显示的选项,请使用“存在检查速记” recommended in the Ruby Style Guide

使用&&=预处理可能存在或可能不存在的变量。使用&&=只会更改该值的存在[意味着,不是nil],而无需使用if检查其存在。

因此,您可以这样做:

s = "12345 "
s &&= s.strip

答案 8 :(得分:0)

简单地说:

s = s.nil? ? s : s.strip

Tl; dr检查s是否为nil,然后返回s,否则,将其剥离。

答案 9 :(得分:0)

您可以简单地做到这一点

s.try(:strip)

答案 10 :(得分:0)

我选择的解决方案是s永远不能以nil开头。

如果||返回虚假值,则可以使用some_method运算符传递默认值:

s = some_method || '' # default to an empty string on falsy return value
s.strip

或者如果已经分配了s,则可以使用||=来执行相同的操作:

s ||= '' # set s to an empty string if s is falsy
s.strip

提供默认方案以不使用参数或变量是保持代码整洁的好方法,因为您不必将逻辑与变量检查混在一起。