rails - Ruby verifica si nula antes de llamar al método.
ruby unless (8)
Tengo una cadena en Ruby en la que llamo al método de tira para eliminar los espacios en blanco iniciales y finales. p.ej
s = "12345 "
s.strip
Sin embargo, si la cadena está vacía me sale el siguiente error.
NoMethodError: método indefinido `strip ''para nil: NilClass
Estoy usando Ruby 1.9, ¿cuál es la forma más fácil de verificar si el valor es nulo antes de llamar al método de tira?
Actualizar:
Intenté esto en un elemento de una matriz pero tuve el mismo problema:
data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip
Método que funciona para mí (lo sé, nunca debería contaminar el espacio del Object
prístino, pero es tan conveniente que me arriesgaré):
class Object
def unless_nil(default = nil, &block)
nil? ? default : block[self]
end
end
p "123".unless_nil(&:length) #=> 3
p nil.unless_nil("-", &:length) #=> "-"
En tu caso particular podría ser:
data[2][1][6].unless_nil { |x| x.split(":")[1].unless_nil(&:strip) }
Puedes usar el método try
desde ActiveSupport (biblioteca Rails)
gem install activesupport
require ''active_support/core_ext/object/try''
s.try(:strip)
o puedes usar mi gema tryit que ofrece instalaciones adicionales:
gem install tryit
s.try { strip }
Ruby 2.3.0 agregó un operador de navegación segura ( &.
) Que comprueba si hay cero antes de llamar a un método.
s&.strip
NoMethodError
nil
si s
es nil
, en lugar de elevar NoMethodError
.
Si desea evitar el error que aparece en la pregunta:
s.to_s.strip
Si no te importa el objeto extra que se está creando, cualquiera de estos trabajos:
"#{s}".strip
s.to_s.strip
Sin objeto extra:
s && s.strip
s.strip if s
Simplemente pon:
s = s.nil? ? s : s.strip
Tl; dr. Compruebe si s es nulo, luego devuelva s; de lo contrario, elimínelo.
Supongo que el método más fácil sería el siguiente:
s.strip if s
ActiveSupport
viene con un método para eso: try
. Por ejemplo, an_object.try :strip
devolverá nil
si an_object
es nil, pero procederá de lo contrario. La sintaxis es la misma que send
. Cf active_support_core_extensions.html#try .