可能已经问过但我找不到..这里有两种常见的情况(对我而言编程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 ..
有什么建议吗? 谢谢!
答案 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)
"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}