我在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
答案 0 :(得分:73)
Ruby 2.3.0添加了一个安全导航操作符(&.
),在调用方法之前检查nil。
s&.strip
如果nil
为s
,则会返回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
提供默认方案以不使用参数或变量是保持代码整洁的好方法,因为您不必将逻辑与变量检查混在一起。