2010-02-03 22 views
15

Esta pregunta es similar a MUCHAS preguntas, pero de ninguna manera es un duplicado. Esta pregunta es acerca de la concatenación de cadenas y la escritura de un código mejor menos de lo que es para verificar cero/cero.Comprobación de una cadena nula antes de la concatenación

Actualmente tengo:

file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1) 

que funciona muy bien, pero no se ve bien. ¿Cuál es la mejor manera de escribir esto en el rubí de modo que yo soy el registro de cero y no concatenándolo

Respuesta

40

Usted puede hacer esto:

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ática:

file.puts "cn: #{var1 or 'unknown'}" 
+7

si var1 es 'falso', verá 'desconocido' en su lugar. –

1
file.puts("cn:" + (var1 || "UNKNOWN")) 
4

que haría lo que Pedro sugirió, suponiendo que false no era un valor válido para var1 y var1 se garantiza que sea nil o una cadena. También fue posible extraer el que la 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 sólo es necesario si var1 no se garantiza que sea nula o una cadena. Alternativamente, si lo hace:

file.puts "cn: #{display_value(var1)}" 

que hará una implícita to_s en el resultado de display_value

1

Desde la parte "cn: " es puramente estético y por lo tanto (más) sujetas a cambios para satisfacer las futuras directrices de presentación, Yo recomendaría usar join;

file.puts(["cn", (var1 || "UNKNOWN")].join(": ") 

Tal vez como una función, como se mencionó anteriormente, la semántica es la misma, solo los nombres de métodos/palabras clave han cambiado;

def value_or_unknown(value, attribute = nil) 
    [attribute, (value or "UNKNOWN")] * ": " 
end 
4

Uso join para agregar las cuerdas que pueden ser nil.

El join no se quejará si hay un nil

Por ejemplo:

["a","b",nil,"c"].join("") 

Will volver

abc 
+0

Esto es cierto solo cuando se une mediante un ["a", "b", nil, "c"]. Join ("_") vacío => "a_b__c" (observe el doble guión bajo 'b') – pseudo

+0

@ pseudo '[" a "," b ", nil," c "]. compact.join (" _ ")' resuelve el problema – Viktor

0

El uso de rubí 2.4.1, to_s resuelve tanto para nil y "Hello" . Entonces var1.to_s debería ser suficiente.

2.4.1 :058 > nil.to_s 
=> "" 
2.4.1 :059 > "hello".to_s 
=> "hello" 
Cuestiones relacionadas