Ruby的简写,“如果它不是空白则使用它,否则使用它”

我有以下代码:

url = file.s3_url.blank? ? file.url : file.s3_url 

是否有更短的方式来写这个?

谢谢!

好吧,你可以在任何file (例如S3File )上写一个方法:

 class S3File def real_url self.s3_url.blank? ? self.url : self.s3_url end #... end 

然后它变得非常简单:

 url = file.real_url 

正如@tokland所说,你可以使用一个or_if方法来修补Object ,它可以这样实现:

 class Object def or_if(method, val = nil) self.send(method) ? (block_given? ? yield : val) : self end end 

这样,你就可以这样做:

 url = file.s3_url.or_if(:blank?) { file.url } 

或这个:

 url = file.s3_url.or_if(:blank?, file.url) 

在ActiveSupport, Object#presence中有一个抽象:

 url = file.s3_url.presence || file.url 

也许,你可以做到以下几点:

 url = file.s3_url || file.url 

如果file.s3_url为nil,此代码将仅使用file.url。 这意味着空字符串不起作用。 如果您想确保不使用空字符串,就像您在示例中所做的那样,那么执行此操作的方法并不短。

我使用实用方法。

 def until_not_blank(*args) args.find {|a| !a.blank? } end url = until_not_blank(file.s3_url, file.url) 

我通常只是将它放在我的ApplicationController中并使其成为帮助器。 如果你想让它全局可用,你可以将它放在内核中,或者你可以使用Monkey-patch Array

 class Array def first_not_blank find {|a| !a.blank?} end end url = [file.s3_url, file.url].first_not_blank 

url = (file.s3_url.blank? && file.s3_url) || file.url
看起来很酷,但实际上我觉得它很混乱,而且喜欢好老三元。