it-swarm.com.de

Gibt es eine bessere Möglichkeit, Null oder Länge einer Zeichenfolge in Ruby zu überprüfen?

Gibt es einen besseren Weg als den folgenden, um zu überprüfen, ob eine Zeichenfolge null ist, OR 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 Handy

string.IsNullOrEmpty(myString)

Etwas Ähnliches wie in Ruby?

161
Jim Fiorato

Wenn ich mir keine Sorgen um die Leistung mache, verwende ich häufig Folgendes:

if my_string.to_s.empty?
  # It's nil or empty
end
214
Ezran

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.

67
Avdi

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

variable.to_s.empty?

das funktioniert, weil:

nil.to_s == ""
"".to_s == ""
61
Vinay Sahni

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
31
Rômulo Ceccon

Wie schon gesagt, Rails (ActiveSupport) haben einen handlichen Rohling? method und es wird so implementiert:

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

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 arbeitet.

28
Honza

variable.blank? tut es . Gibt true zurück, wenn der String leer ist oder wenn der String null ist.

15
Satya Kalluri

nil? kann in booleschen Kontexten weggelassen werden. Im Allgemeinen können Sie dies verwenden, um den C # -Code zu replizieren:

return my_string.nil? || my_string.empty?
12
Konrad Rudolph

Vorsicht vor dieser Methode:

Wie Jesse Ezel sagt:

Brad Abrams

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

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

Das NullOrEmpty-Protokoll ist in der Regel eine schnelle Lösung (das eigentliche Problem liegt also immer noch woanders, und Sie haben zwei Protokolle verwendet) oder es ist ein Mangel an Fachwissen über ein bestimmtes Protokoll, wenn Sie neuen Code implementieren Ihre Rückgabewerte sind). "

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

class NilClass
    def empty?; true; end
end
7
VonC

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 ein String nicht gleich nil ist, wenn er leer ist. Verwenden Sie die empty?-Methode, um zu überprüfen, ob ein String leer ist.

5
Jeremy Ruten

Eine weitere Möglichkeit ist, nil in ein leeres Ergebnis umzuwandeln:

(my_string||'').empty?

4
mahemoff

Konrad Rudolph hat die richtige Antwort.

Wenn es Sie wirklich stört, reparieren Sie die String-Klasse oder fügen Sie sie einer Klasse/einem Modul Ihrer Wahl hinzu. Es ist wirklich keine gute Praxis, Kernobjekte 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 String.nilorempty? mystring

2
jcoby

Suchen Sie in Plain nach leeren Zeichenfolgen Ruby unter Vermeidung von NameError-Ausnahmen

Hier gibt es einige gute Antworten, aber Sie benötigen weder ActiveSupport noch Affen-Patches, um den hier üblichen Anwendungsfall zu behandeln. Zum Beispiel:

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 if auslöst my_string ist nicht definiert. Dies ist im Allgemeinen den ausgeklügelten vorzuziehen:

my_string.to_s.empty? rescue NameError

oder seine ausführlichere Art, weil Ausnahmen wirklich für Dinge gespeichert werden sollten, die Sie nicht erwarten. In diesem Fall ist eine undefinierte Variable, obwohl es sich um einen häufigen Fehler handeln kann, kein außergewöhnlicher Umstand. Daher sollte sie entsprechend behandelt werden.

Ihr Kilometerstand kann variieren.

2
Todd A. Jacobs

Haben Sie Verfeinerungen 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
RichOrElse

Für Code-Golfer (erfordert Ruby 2.3 oder höher):

if my_string&.> ""
  p 'non-empty string'
else
  p 'nil or empty string'
end
0
snipsnipsnip

In Rails können Sie #blank? ausprobieren.

Achtung: Sie erhalten ein positives Ergebnis, wenn der String aus Leerzeichen besteht:

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

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

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

0
Nondv