Преобразование пустой строки в ноль в Ruby - PullRequest
23 голосов
/ 15 марта 2009

У меня есть строка с именем word и функция с именем infinitive такая, что
word.infinitive будет возвращать другую строку в некоторых случаях и пустую строку в противном случае
Я пытаюсь найти элегантное рубиновое однострочное выражение для фрагмента кода ниже

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

Если бы инфинитив вернул ноль вместо "", я мог бы сделать что-то вроде

(word.infinitive or word)

Но поскольку это не так, я не могу воспользоваться коротким замыканием ИЛИ
В идеале я бы хотел
1) единственное выражение, которое я мог бы легко встроить в другой код
2) функция инфинитива вызывается только один раз
3) не добавлять какие-либо пользовательские гемы или плагины в мой код

Ответы [ 6 ]

123 голосов
/ 25 марта 2011

Метод ActiveSupport presence преобразует пустую (или blank?) строку в nil. Он предназначен для вашего конкретного случая использования:

word.infinitive.presence || word

Обратите внимание, что вы можете легко использовать ActiveSupport вне рельсов:

require 'active_support/core_ext/object/blank'
8 голосов
/ 07 июня 2010

Вы можете использовать регулярные выражения, такие как , эта статья предлагает

(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil
6 голосов
/ 15 марта 2009

Сделайте правильно - исправьте инфинитив, чтобы он возвращал нули вместо пустых строк, или оберните его собственным интерфейсом, если вы действительно не можете его коснуться.

5 голосов
/ 15 марта 2009

Если вам не стыдно обезьянничать и злоупотреблять синтаксисом, это будет работать:

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

Тогда вы можете сказать word.infinitive | word, что на самом деле довольно естественно, если вы спросите меня.

Однако я думаю, что лучшей идеей было бы изменить метод инфинитива или добавить его версию, которая возвращает слово без изменений.

Редактировать: Вот, возможно, более элегантное решение:

[word.infinitive, word].find {|x| not x.empty?}
4 голосов
/ 26 мая 2010

Или вы можете установить новую функцию для String без необходимости злоупотреблять синтаксисом.

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

Теперь вы можете сделать

puts var.squash or "default text"

Я не являюсь носителем английского языка, поэтому я не знаю, является ли squash лучшим словом. Есть ли слово, которое лучше передало бы идею «превращаться в ноль, только если пусто»?

4 голосов
/ 15 марта 2009

Вы можете использовать троичный оператор (boolean ? true-val : false-val) с String#empty?

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

, если вы хотите вызвать инфинитив только один раз:

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

Возможно, вы захотите добавить в свой код памятку .

...