ruby - palabras - Comprobando la cadena nula antes de concatenar
contar palabras en numbers (6)
Esta pregunta es similar a MUCHAS preguntas, pero de ninguna manera es un duplicado. Esta pregunta trata sobre la concatenación de cadenas y la escritura de un código mejor que de la comprobación de cero / cero.
Actualmente tengo:
file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)
Lo que funciona bien, pero no se ve bien. ¿Cuál es la mejor manera de escribir esto en ruby para que yo compruebe que no hay nada y no lo concatene?
Dado que la parte "cn: "
es puramente estética y, por lo tanto (¿más?) Sujeta a cambios para cumplir con las futuras pautas de presentación, recomendaría usar join;
file.puts(["cn", (var1 || "UNKNOWN")].join(": ")
Tal vez como función, como se mencionó anteriormente, la semántica es la misma, solo los nombres de los métodos / palabras clave han cambiado;
def value_or_unknown(value, attribute = nil)
[attribute, (value or "UNKNOWN")] * ": "
end
Haría lo que Peter sugirió, asumiendo que false
no era un valor válido para var1
, y var1
estaba garantizado como nil
o una cadena. También puedes extraer esa lógica en una función:
def display_value(var)
(var || "UNKNOWN").to_s # or (var.nil? ? "UNKNOWN" : var.to_s) if ''false'' is a valid value
end
file.puts "cn: " + display_value(var1)
to_s
solo es necesario si var1
no garantiza ser nulo o una cadena. Alternativamente, si lo haces:
file.puts "cn: #{display_value(var1)}"
Hará un implícito to_s
en el resultado de display_value
Puedes hacerlo:
file.puts "cn: " + (var1 || "UNKNOWN")
o, de forma idéntica si lo prefiere:
file.puts "cn: " + (var1 or "UNKNOWN")
o mi favorito, que creo que es el rubí más idiomático:
file.puts "cn: #{var1 or ''unknown''}"
Usando ruby 2.4.1, to_s
resuelve tanto para nil
como para "Hello"
. Entonces var1.to_s
debería ser suficiente.
2.4.1 :058 > nil.to_s
=> ""
2.4.1 :059 > "hello".to_s
=> "hello"
Utilice join
para agregar las cadenas que pueden ser nil
.
La join
no se quejará si hay un nil
Por ejemplo:
["a","b",nil,"c"].join("")
#=> abc
Sin embargo, si te estás uniendo con algo que no sea una cadena en blanco, como un guión bajo, obtendrás una cadena de unión para el valor nil
:
["a","b",nil,"c"].join("_")
#=> a_b__c
Para solucionar esto, use .compact
para eliminar los valores nil
de la Array
antes de unirse:
["a","b",nil,"c"].compact.join("_")
#=> a_b_c
file.puts( "cn:" + (var1 || "UNKNOWN" ))