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?


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

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.


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 == ""

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

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.


15

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


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?

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

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.


4

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

(my_string||'').empty?


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


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.


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?

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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.