ruby syntactic sugar:处理nils

时间:2010-12-30 19:15:43

标签: ruby idioms

可能已经问过但我找不到..这里有两种常见的情况(对我而言编程rails ..)在ruby中写的很令人沮丧:

"a string".match(/abc(.+)abc/)[1]

在这种情况下我得到一个错误,因为字符串不匹配,因此[]运算符在nil时被调用。我想要找到的是一个更好的替代方案:

temp="a string".match(/abc(.+)abc/); temp.nil? ? nil : temp[1]

简而言之,如果它不匹配则只返回nil而没有错误

第二种情况就是这个:

var = something.very.long.and.tedious.to.write
var = something.other if var.nil?

在这种情况下,我想要将一些内容分配给var,如果它不是nil,如果它是nil我将分配something.other ..

有什么建议吗? 谢谢!

6 个答案:

答案 0 :(得分:3)

在Ruby on Rails中,您可以在任何Object上使用try方法。根据API:

调用symbol方法标识的方法,向其传递任何参数和/或指定的块,就像常规的Ruby Object #send一样。

与该方法不同,如果接收对象是nil对象或NilClass,则不会引发NoMethodError异常,而是返回nil。

因此,对于第一个问题,您可以这样做:

"a string".match(/abc(.+)abc/).try(:[], 1)

它会给你[1]或者没有错误。

答案 1 :(得分:3)

"a string"[/abc(.+)abc/, 1]
# => nil
"abc123abc"[/abc(.+)abc/, 1]
# => "123"

var = something.very.long.and.tedious.to.write || something.other

请注意,or的运算符优先级与||不同,||应优先使用此类用法。 or运算符用于流量控制用法,例如ARGV[0] or abort('Missing parameter')

答案 2 :(得分:3)

忘记Python atavism!

"a string"[/abc(.+)abc/,1] # => nil

答案 3 :(得分:0)

首先我推荐ickmaybe(相当于andand

"a string".match(/abc(.+)abc/).maybe[1]

我不确定我理解第二个,你想要这个吗?

var = something.very.long.and.tedious.to.write || something.other

答案 4 :(得分:0)

"a string".match(/foo(bar)/).to_a[1]

NilClass#to_a返回一个空数组,在其外部编制索引会为您提供nil个值。

或者(我做的)你可以给匹配打开:

_, some, more = "a string".match(/foo(bar)(jim)/).to_a

答案 5 :(得分:0)

对于第一个问题,我认为Bob的答案很好。

关于第二个问题,

var = something.very.long.and.tedious.to.write.instance_eval{nil? ? something.other : self}