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

ped*_*rom 16 ruby ruby-on-rails

我有以下代码:

url = file.s3_url.blank? ? file.url : file.s3_url
Run Code Online (Sandbox Code Playgroud)

有没有更短的方式来写这个?

谢谢!

Jac*_*kin 20

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

class S3File 
   def real_url
     self.s3_url.blank? ? self.url : self.s3_url
   end
   #...
end
Run Code Online (Sandbox Code Playgroud)

然后它变得非常简单:

url = file.real_url 
Run Code Online (Sandbox Code Playgroud)

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

class Object
   def or_if(method, val = nil)
      self.send(method) ? (block_given? ? yield : val) : self
   end         
end
Run Code Online (Sandbox Code Playgroud)

这样,您就可以这样做:

url = file.s3_url.or_if(:blank?) { file.url }
Run Code Online (Sandbox Code Playgroud)

或这个:

url = file.s3_url.or_if(:blank?, file.url)
Run Code Online (Sandbox Code Playgroud)

  • 我并不是说你做不到,但是当你开始走这条路时,你最终可能会得到一个充满鬼鬼祟祟的方法的应用程序,它可能会让其他人感到困惑。拥有标准功能总是更好。幸运的是,我的很多“技巧”最终都被 ActiveSupport 所采用。 (2认同)

tok*_*and 19

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

url = file.s3_url.presence || file.url
Run Code Online (Sandbox Code Playgroud)


Pan*_*kos 9

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

url = file.s3_url || file.url
Run Code Online (Sandbox Code Playgroud)

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