Frage

Ich habe eine Zeichenfolge namens word und eine Funktion namens infinitive , so dass
word.infinitive zurückkehren würde einer anderen Zeichenfolge auf einige Gelegenheiten, und andernfalls eine leere Zeichenfolge
Ich bin auf der Suche nach einem eleganten ruby eine Linie Ausdruck für das code-snippet unten

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

Hatte Infinitiv zurückgegeben wird null anstelle von "; " ich könnte etwas getan haben, wie

(word.infinitive or word)

Da es aber nicht, ich kann nicht nehmen Sie Vorteil der kurzen-Schaltung ODER
Idealerweise würde ich wollen
1) ein einzelner Ausdruck, ich könnte einfach einbetten in andere code
2) die Funktion Infinitiv wird nur einmal aufgerufen
3) nicht fügen Sie alle benutzerdefinierten Edelsteine oder plugins in meinem code

War es hilfreich?

Lösung

Wenn Sie sind nicht schämen, monkeypatching und missbrauchen syntax, dies funktionieren würde:

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

Dann kann man sagen, word.infinitive | word, die tatsächlich durchsucht relativ natürlich, wenn Ihr mich fragt.

Ich denke jedoch, dass eine bessere Idee wäre, ändern Sie den Infinitiv-Methode, oder fügen Sie eine version, dass es gibt das Wort unverändert.

Edit: Hier ist möglicherweise eine elegantere Lösung:

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

Andere Tipps

Der ActiveSupport presence Methode konvertiert einen leeren (oder blank?) string nil.Es ist entwickelt für Ihre genauen Anwendungsfall:

word.infinitive.presence || word

Beachten Sie, dass Sie können leicht verwenden ActiveSupport außerhalb der Schienen:

require 'active_support/core_ext/object/blank'

Können Sie einen regex verwenden, wie dieser Artikel schlägt

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

Tun Sie das richtige - fix Infinitiv, so dass es kehrt nils anstelle von leeren Saiten oder wickeln Sie es mit Ihren eigenen interface, wenn Sie können nicht wirklich berühren.

Sie könnte verwenden die ternäre operator (boolean ? true-val : false-val) mit String#empty?

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

wenn Sie nur wollen, rufen Infinitiv einmal:

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

Möglicherweise möchten Sie auch zu prüfen, indem einige memoization zu Ihrem code.

Oder Sie können monkeypatch eine neue Funktion, die String ohne Missbrauch syntax.

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

Jetzt können Sie tun

puts var.squash or "default text"

Ich bin kein englischer Muttersprachler, also ich weiß nicht, wenn squash ist das beste Wort.Gibt es ein Wort, das würde besser vermitteln die Idee von "biegen Sie in die null nur, wenn leer"?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top