Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby在调用方法之前检查是否为nil_Ruby_Null - Fatal编程技术网

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

Ruby在调用方法之前检查是否为nil,ruby,null,Ruby,Null,我在Ruby中有一个字符串,我正在调用strip方法来删除前导和尾随空格。e、 g s = "12345 " s.strip 但是,如果字符串为空nil,则会出现以下错误 NoMethodError: undefined method `strip' for nil:NilClass 我使用的是Ruby 1.9,那么在调用strip方法之前,检查值是否为nil的最简单方法是什么 更新: 我在数组中的元素上尝试了此操作,但遇到了相同的问题: data[2][1][6].nil? ? data[

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

s = "12345 "
s.strip
但是,如果字符串为空
nil
,则会出现以下错误

NoMethodError: undefined method `strip' for nil:NilClass
我使用的是Ruby 1.9,那么在调用strip方法之前,检查值是否为
nil
的最简单方法是什么

更新:

我在数组中的元素上尝试了此操作,但遇到了相同的问题:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip
简言之:

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

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

我想最简单的方法如下:

s.strip if s
适合我的方法(我知道,我永远不会污染原始的
对象
空间,但它非常方便,我会冒险):

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


数据[2][1][6]。除非{u nil{x | x.split(“:”[1]。除非{u nil(&:strip)}
您可以使用ActiveSupport(Rails库)中的方法
try

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

gem install tryit

s.try { strip }

ActiveSupport
提供了一种方法:
try
。例如,如果
一个\u对象
为nil,try:strip将返回
nil
,否则将继续。语法与
send
相同。Cf.

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

s.to_s.strip

如果您不介意创建额外的对象,请执行以下任一操作:

"#{s}".strip
s.to_s.strip
无额外对象:

s && s.strip
s.strip if s
添加了一个安全导航操作符(
&.
),该操作符在调用方法之前检查nil

s&.strip

如果
s
nil
,则此表达式返回
nil
,而不是提高
NoMethodError

s
一开始就不能是
nil
的解决方案

如果
some\u方法
返回错误值,则可以使用
|
运算符传递默认值:

s = some_method || '' # default to an empty string on falsy return value
s.strip
或者,如果已经分配了
s
,您可以使用
|124;=
执行相同的操作:

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

为缺少参数或变量提供默认场景是保持代码整洁的好方法,因为您不必将逻辑与变量检查混为一谈。

要完成此处显示的选项,有“存在性检查速记”:

使用
&&=
预处理可能存在或可能不存在的变量。使用
&&=
将仅在值存在时更改该值[表示该值不是
nil
],无需在
存在时使用
检查该值

因此,在您的情况下,您会:

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

@lukad有一个比这个更简单的答案。谢谢-刚刚在数组中的一个元素上尝试了这个方法,并结合了split。但它似乎仍然失败了:。放入数据[2][1][6]。无?数据[2][1][6]:数据[2][1][6]。拆分(“:”[1]。条带。NoMethodError:nil:nilclass的未定义方法'strip'数据[2][1][6]有什么作用。split(“:”
返回?似乎它只有一个项目。这已经以某种方式或其他方式被问了几十次:原始海报注意:字符串并不像您声称的那样是空的,即
s=“”
,它是零。它还不存在。如果是空的,您可以检查:
s.strip,除非s.empty?
如果字符串是空的,您不会得到该错误。对于第二个问题,请添加:
data.dig(2,1,6)和.split(“:”[1]&.strip
)。如果数据的任何部分丢失或格式不正确,整个表达式将返回
nil
,不会有任何错误。如果您尝试链接内容,则不太方便。需要的是一种通用的方式,即“如果我对nil调用一个方法,只需返回nil”,这样我们就不必用这些东西来混乱代码。我们需要“脚本语言”功能。也许可以在开发级别向控制台中添加一些东西,以便在意外获得零时帮助解决问题。@JosephK查看Jessie Sielaff的答案。您所寻找的是Ruby 2.3中添加的。这叫安全导航操作员。@lukad-谢谢。现在,如果有一种方法可以使其成为默认行为的话。是的,这是使Ruby的行为有点像一种合适的web脚本语言的唯一方法。如果有一种方法可以在所有出现这种恼人且无用的行为的情况下全局设置它,并在需要时(如puts语句)在默认情况下将所有值“隐式转换”为字符串,那该多好啊useful@JosephK:你用过Ruby吗
IO#put
确实对其所有参数调用了
,例如
put(5)
。另外,尝试
类NilClass;def方法_缺失(*a);无结束;end
由于Ruby的行为与Ecmascript的行为不一样,我无法计算在对元素、put等进行求和时失败的次数-做出明智的选择-考虑到很少有情况下“nil”不应被视为“”或零(取决于上下文)。@JosephK
nil
(或
null
)被调用,除其他外。
s ||= '' # set s to an empty string if s is falsy
s.strip
s = "12345 "
s &&= s.strip