¿Hay una Mejor Manera de Comprobar Nil o Length == 0 de una Cadena en Ruby?


¿Hay una mejor manera que la siguiente para comprobar si una cadena es nil O tiene una longitud de 0 en Ruby?

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

En C # está la práctica

string.IsNullOrEmpty(myString)

¿Algo similar a eso en Ruby?

 154
Author: snipsnipsnip, 2008-10-29

15 answers

Cuando no estoy preocupado por el rendimiento, a menudo usaré esto:

if my_string.to_s.empty?
  # It's nil or empty
end
 202
Author: Ezran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-14 22:18:49

Si está dispuesto a requerir ActiveSupport, puede usar el método #blank?, que está definido tanto para NilClass como para String.

 66
Author: Avdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 20:05:06

Me gusta hacer esto de la siguiente manera (en un entorno no Rails/ActiveSupport):

variable.to_s.empty?

Esto funciona porque:

nil.to_s == ""
"".to_s == ""
 61
Author: Vinay Sahni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-28 21:06:14

Una alternativa a la propuesta de jcoby sería:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end
 31
Author: Rômulo Ceccon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 19:14:22

Como se decía aquí antes de que Rails (ActiveSupport) tenga un práctico en blanco? método y se implementa así:

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

Bastante fácil de añadir a cualquier proyecto basado en ruby.

La belleza de esta solución es que funciona automáticamente no solo para cadenas, sino también para matrices y otros tipos.

 28
Author: Honza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 20:18:02

Variable.en blanco? lo haré. Devuelve true si la cadena está vacía o si la cadena es nula.

 14
Author: Satya Kalluri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-25 07:18:24

nil? se puede omitir en contextos booleanos. Generalmente, puede usar esto para replicar el código C#:

return my_string.nil? || my_string.empty?
 11
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 18:55:09

En primer lugar, cuidado con ese método:

Como Jesse Ezel dice:

Brad Abrams

"El método puede parecer conveniente, pero la mayoría de las veces he encontrado que esta situación surge de tratar de encubrir errores más profundos.

Su código debe atenerse a un protocolo en particular sobre el uso de cadenas, y debe comprender el uso del protocolo en el código de la biblioteca y en el código con el que está trabajando.

El protocolo NullOrEmpty es típicamente una solución rápida (por lo que el problema real está todavía en otro lugar, y tiene dos protocolos en uso) o es una falta de experiencia en un protocolo en particular al implementar nuevo código (y nuevamente, debería saber realmente cuáles son sus valores de retorno)."

Y si parcheas la clase String... asegúrese NilClass tampoco ha sido parche!

class NilClass
    def empty?; true; end
end
 7
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 19:19:56

Cada clase tiene un método nil?:

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

Y las cadenas tienen el método empty?:

if a_string.empty?
    # the string is empty
}

Recuerde que una cadena no es igual a nil cuando está vacía, así que use el método empty? para verificar si una cadena está vacía.

 3
Author: Jeremy Ruten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 18:52:26

Konrad Rudolph tiene la respuesta correcta.

Si realmente te molesta, monkey parchea la clase String o agrégala a una clase/módulo de tu elección. Realmente no es una buena práctica para monkey patch core objetos a menos que tenga una razón realmente convincente sin embargo.

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

Entonces puedes hacer String.nilorempty? mystring

 2
Author: jcoby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 19:07:54

Compruebe si hay Cadenas Vacías en Ruby Llano Mientras Evita las Excepciones de NameError

Hay algunas buenas respuestas aquí, pero no necesita ActiveSupport o monkey-patching para abordar el caso de uso común aquí. Por ejemplo:

my_string.to_s.empty? if defined? my_string

Esto de "hacer lo correcto" si my_string es igual a cero o una cadena vacía, pero no subirá NameError exception si my_string no está definido. Esto es generalmente preferible a lo más artificial:

my_string.to_s.empty? rescue NameError

O sus más prolijo, porque las excepciones deberían guardarse para cosas que no esperan que sucedan. En este caso, si bien podría ser un error común, una variable indefinida no es realmente una circunstancia excepcional, por lo que debe manejarse en consecuencia.

Su kilometraje puede variar.

 2
Author: Todd A. Jacobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-20 04:58:18

Otra opción es convertir nil a un resultado vacío sobre la marcha:

(my_string||'').empty?

 1
Author: mahemoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-12 10:51:16

¿Has intentado Refinamientos?

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
Author: RichOrElse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-11 10:59:20

Para los golfistas de código (requiere ruby 2.3 o posterior):

if my_string&.> ""
  p 'non-empty string'
else
  p 'nil or empty string'
end
 0
Author: snipsnipsnip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-27 00:59:13

En rails puedes probar #blank?.

Advertencia: le dará aspectos positivos cuando la cadena se compone de espacios:

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

Solo quería señalarlo. Tal vez se adapte a sus necesidades

UPD. ¿por qué estoy recibiendo viejas preguntas en mi feed? Perdón por el necroposting.

 0
Author: Nondv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-30 14:02:55