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
看起来很酷,但实际上我觉得它很混乱,而且喜欢好老三元。