Gibt es eine bessere Möglichkeit, Null oder Länge == 0 eines Strings in Ruby zu überprüfen?

169

Gibt es eine bessere Möglichkeit als die folgende, um zu überprüfen, ob eine Zeichenfolge Null ist ODER in Ruby eine Länge von 0 hat?

if !my_string || my_string.length == 0
  return true
else
  return false
end

In C # gibt es das Praktische

string.IsNullOrEmpty(myString)

Ähnliches wie in Ruby?

Jim Fiorato
quelle
16
Es ist überflüssig, eine if-Anweisung wie diese zu haben: "if (Bedingung) dann true else false". Die Bedingung selbst hat die gleiche Wahrhaftigkeit wie die if-Aussage.
KaptajnKold
my_string || my_string.length == 0wird ein NoMethodErrorif erhöhen, wenn my_stringnull ist. Ich denke, Sie meinten:my_string.nil? || my_string.length == 0
Naveed
1
Sollte es sein!my_string || my_string.length == 0
Levsa

Antworten:

224

Wenn ich mir keine Sorgen um die Leistung mache, verwende ich oft Folgendes:

if my_string.to_s == ''
  # It's nil or empty
end

Es gibt natürlich verschiedene Variationen ...

if my_string.to_s.strip.length == 0
  # It's nil, empty, or just whitespace
end
Ezran
quelle
2
Die Variation mit stripkann sehr ineffizient sein.
Marc-André Lafortune
10
Ein anderer interessanter Weg ist my_string.to_s.empty?
Ricardo Pessoa
Für die meisten Menschen ist die erste Option völlig akzeptabel und liest sich gut.
Amrcus
68

Wenn Sie ActiveSupport benötigen, können Sie einfach die #blank?Methode verwenden, die sowohl für NilClass als auch für String definiert ist.

Avdi
quelle
15
Beachten Sie, dass eine Zeichenfolge, die nur Leerzeichen enthält, weiterhin als leer betrachtet wird. Also "" .blank? ist wahr.
Grant Hutchins
2
Außerdem werden boolean false, {} und [] als leer betrachtet. Dh {} .blank?, [] .Blank?, False.blank? alle bewerten als wahr.
ShaharZ
64

Ich mache das gerne wie folgt (in einer Umgebung ohne Rails / ActiveSupport):

variable.to_s.empty?

das funktioniert weil:

nil.to_s == ""
"".to_s == ""
Vinay Sahni
quelle
3
Eine gute Erklärung, warum string.to_s.empty?für beide nilund funktioniert "".
Georger
31

Eine Alternative zu jcobys Vorschlag wäre:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end
Rômulo Ceccon
quelle
10
Aber .. aber .. Die Ruby Core Bibliothek implementiert dies bereits. nil.to_s => "", so können Sie thing.to_s == "" sagen
DigitalRoss
1
@DigitalRoss Dies vermeidet die Zeichenfolgenkonvertierung, die ein geringfügiges Leistungsproblem darstellen kann oder nicht.
Vortico
30

Wie hier schon gesagt, haben Rails (ActiveSupport) einen praktischen Rohling? Methode und es ist wie folgt implementiert:

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

Ziemlich einfach zu jedem Ruby-basierten Projekt hinzuzufügen.

Das Schöne an dieser Lösung ist, dass sie nicht nur für Strings, sondern auch für Arrays und andere Typen automatisch magisch funktioniert.

Honza
quelle
15

variable.blank? werde es tun. Es gibt true zurück, wenn die Zeichenfolge leer ist oder wenn die Zeichenfolge null ist.

Satya Kalluri
quelle
12
Eigentlich ist dies eine Schienenverlängerung, kein reiner Rubin. Aber wenn Sie Schienen verwenden, ist es sehr praktisch!
James P McGrath
13

nil?kann in booleschen Kontexten weggelassen werden. Im Allgemeinen können Sie damit den C # -Code replizieren:

return my_string.nil? || my_string.empty?
Konrad Rudolph
quelle
7

Achten Sie zunächst auf diese Methode:

Wie Jesse Ezel sagt:

Brad Abrams

"Die Methode mag zweckmäßig erscheinen, aber die meiste Zeit habe ich festgestellt, dass diese Situation durch den Versuch entsteht, tiefere Fehler zu vertuschen.

Ihr Code sollte sich an ein bestimmtes Protokoll zur Verwendung von Zeichenfolgen halten, und Sie sollten die Verwendung des Protokolls im Bibliothekscode und in dem Code, mit dem Sie arbeiten, verstehen.

Das NullOrEmpty-Protokoll ist in der Regel eine schnelle Lösung (das eigentliche Problem liegt also noch an einer anderen Stelle, und Sie haben zwei Protokolle verwendet), oder es mangelt an Fachwissen in einem bestimmten Protokoll, wenn neuer Code implementiert wird (und Sie sollten auch hier wirklich wissen, was Ihre Rückgabewerte sind). "

Und wenn Sie die String-Klasse patchen ... stellen Sie sicher, dass NilClass auch nicht gepatcht wurde !

class NilClass
    def empty?; true; end
end
VonC
quelle
5

Jede Klasse hat eine nil?Methode:

if a_variable.nil?
    # the variable has a nil value
end

Und Strings haben die empty?Methode:

if a_string.empty?
    # the string is empty
}

Denken Sie daran, dass eine Zeichenfolge nicht gleich ist, nilwenn sie leer ist. Verwenden Sie daher die empty?Methode, um zu überprüfen, ob eine Zeichenfolge leer ist.

Jeremy Ruten
quelle
4

Eine andere Möglichkeit besteht darin, Null im laufenden Betrieb in ein leeres Ergebnis umzuwandeln:

(my_string||'').empty?

Mahemoff
quelle
2

Konrad Rudolph hat die richtige Antwort.

Wenn es Sie wirklich nervt, patchen Sie die String-Klasse mit einem Affen oder fügen Sie sie einer Klasse / einem Modul Ihrer Wahl hinzu. Es ist wirklich keine gute Praxis, Kernobjekte von Affen zu patchen, es sei denn, Sie haben einen wirklich zwingenden Grund.

class String
  def self.nilorempty?(string)
    string.nil? || string.empty?
  end
end

Dann können Sie tun String.nilorempty? mystring

jcoby
quelle
2

Suchen Sie in Plain Ruby nach leeren Zeichenfolgen, während Sie NameError-Ausnahmen vermeiden

Hier gibt es einige gute Antworten, aber Sie benötigen weder ActiveSupport noch Affen-Patching, um den hier üblichen Anwendungsfall zu lösen. Beispielsweise:

my_string.to_s.empty? if defined? my_string

Dies wird "das Richtige tun", wenn my_string null oder eine leere Zeichenfolge ist, aber keine NameError-Ausnahme auslösen, wenn my_string nicht definiert ist. Dies ist im Allgemeinen den erfundenen vorzuziehen:

my_string.to_s.empty? rescue NameError

oder es ist ausführlicher, weil Ausnahmen wirklich für Dinge gespeichert werden sollten, die Sie nicht erwarten. In diesem Fall ist eine undefinierte Variable zwar ein häufiger Fehler, aber kein außergewöhnlicher Umstand. Daher sollte sie entsprechend behandelt werden.

Ihr Kilometerstand kann variieren.

Todd A. Jacobs
quelle
1

Haben Sie Refinements ausprobiert?

module Nothingness
  refine String do
    alias_method :nothing?, :empty?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

return my_string.nothing?
RichOrElse
quelle
1

Wenn Sie Schienen verwenden, können Sie verwenden #present?

require 'rails'

nil.present?  # ==> false (Works on nil)
''.present?    # ==> false (Works on strings)
'  '.present?  # ==> false (Works on blank strings)
[].present?    # ==> false(Works on arrays)
false.present? # ==> false (Works on boolean)

Umgekehrt, um zu prüfen, ob keine oder keine Länge verwendet wird !present?

!(nil.present?)  # ==> true
!(''.present?)    # ==> true
!('  '.present?)  # ==> true
!([].present?)    # ==> true
!(false.present?) # ==> true
Dhivya Dandapani
quelle
0

In Schienen können Sie versuchen #blank?.

Warnung: Sie erhalten positive Ergebnisse, wenn der String aus Leerzeichen besteht:

nil.blank? # ==> true
''.blank? # ==> true
'  '.blank? # ==> true
'false'.blank? # ==> false

Ich wollte nur darauf hinweisen. Vielleicht passt es Ihren Bedürfnissen

UPD. Warum bekomme ich alte Fragen in meinem Feed? Entschuldigung für die Nekropostierung.

Nondv
quelle
0

Für Code-Golfer:

if my_string=~/./
  p 'non-empty string'
else
  p 'nil or empty string'
end

Oder wenn Sie kein Golfer sind (erfordert Ruby 2.3 oder höher):

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
snipsnipsnip
quelle