Die Umwandlung einer leeren Zeichenfolge in null in Ruby
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
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"?