首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby语法糖:处理nils

ruby语法糖:处理nils
EN

Stack Overflow用户
提问于 2010-12-31 03:15:43
回答 6查看 447关注 0票数 5

可能已经问过了,但是我找不到..这里有两种常见的情况(对于我来说,在编程rails时)。在ruby中编写是令人沮丧的:

代码语言:javascript
复制
"a string".match(/abc(.+)abc/)[1]

在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想要找到的是一个比下面的更好的选择:

代码语言:javascript
复制
temp="a string".match(/abc(.+)abc/); temp.nil? ? nil : temp[1]

简而言之,如果不匹配,只需返回nil而不返回错误

第二种情况是这样的:

代码语言:javascript
复制
var = something.very.long.and.tedious.to.write
var = something.other if var.nil?

在本例中,我只想在不为nil的情况下为var赋值,以防为nil赋值为something.other。

有什么建议吗?谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-31 03:19:06

对于第一个,我推荐ickmaybe (相当于andand)

代码语言:javascript
复制
"a string".match(/abc(.+)abc/).maybe[1]

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

代码语言:javascript
复制
var = something.very.long.and.tedious.to.write || something.other
票数 0
EN

Stack Overflow用户

发布于 2010-12-31 03:35:20

在Ruby on Rails中,您可以在任何对象上使用try方法。根据该接口:

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

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

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

代码语言:javascript
复制
"a string".match(/abc(.+)abc/).try(:[], 1)

它会给你一个没有错误的1或nil。

票数 3
EN

Stack Overflow用户

发布于 2010-12-31 03:40:33

代码语言:javascript
复制
"a string"[/abc(.+)abc/, 1]
# => nil
"abc123abc"[/abc(.+)abc/, 1]
# => "123"

和:

代码语言:javascript
复制
var = something.very.long.and.tedious.to.write || something.other

请注意,与||相比,or具有不同的运算符优先级,对于这种用法,应首选||or运算符用于流控制用途,如ARGV[0] or abort('Missing parameter')

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4565496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档