Converting an empty string into nil in Ruby

我与影子孤独终老i 提交于 2021-02-05 20:20:32

问题


I have a string called word and a function called infinitive such that
word.infinitive would return another string on some occasions and an empty string otherwise
I am trying to find an elegant ruby one line expression for the code-snippet below

if word.infinitive == ""
      return word
else return word.infinitive

Had infinitive returned nil instead of "", I could have done something like

(word.infinitive or word)

But since it does not, I can't take advantage of the short-circuit OR
Ideally I would want
1) a single expression that I could easily embed in other code
2) the function infinitive being called only once
3) to not add any custom gems or plugins into my code


回答1:


If you're not ashamed of monkeypatching and abusing syntax, this would work:

class String
  def | x
    if empty? then x else self end
  end
end

Then you can say word.infinitive | word, which actually scans fairly naturally, if you ask me.

However, I think a better idea would be to modify the infinitive method, or add a version of it that returns the word unchanged.

Edit: Here's a possibly more elegant solution:

[word.infinitive, word].find {|x| not x.empty?}



回答2:


The ActiveSupport presence method converts an empty (or blank?) string to nil. It's designed for your exact use case:

word.infinitive.presence || word

Note that you can easily use ActiveSupport outside of rails:

require 'active_support/core_ext/object/blank'



回答3:


You can use a regex like this article suggests

(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil



回答4:


Do the right thing - fix infinitive so that it returns nils instead of blank strings, or wrap it with your own interface if you really can't touch it.




回答5:


You could use the ternary operator (boolean ? true-val : false-val) with String#empty?

return word.infinitive.empty? ? word : word.infinitive

if you only want to call infinitive once:

return (inf = word.infinitive).empty? ? word : inf

You may also want to consider adding some memoization to your code.




回答6:


Or you can monkeypatch a new function to String without having to abuse syntax.

class String
  def squash
    self.empty? ? nil : self
  end
end

Now you can do

puts var.squash or "default text"

I'm not a native english speaker so I don't know if squash is the best word. Is there a word that would better convey the idea of "turn into nil only if empty"?



来源:https://stackoverflow.com/questions/647370/converting-an-empty-string-into-nil-in-ruby

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!