2011-06-21 8 views
5

considerar lo siguiente:En clojure, ¿por qué dividir una cadena de un archivo vacío devuelve 1 elemento?

=> (even? (count [])) 
true 

hasta ahora tan bueno. Consideremos ahora (suponiendo que mi-archivo está vacío):

(odd? (count (str/split (slurp my-file) #"\|"))) 
true 

err ... ¿por qué es el vector de regresar de un archivo vacío ni siquiera (cero)?

=>(str/split (slurp my-file) #"\|") 
[""] 

Ahh, ¿alguien puede explicar por qué se devuelve una cadena vacía en este caso?

Estoy intentando determinar si hay un número impar de registros en un archivo o no.

Respuesta

7

clojure.string/split utiliza java.util.regex.Pattern/split para dividir. Ver this question about Java para una explicación. A saber, split devuelve todo antes de la primera coincidencia de su patrón como la primera división, incluso si el patrón no coincide en absoluto.

La manera canónica de comprobar si una colección (lista, matriz, mapa, cadena, etc.) está vacía o no es llamar al seq, que devolverá nil para una colección vacía.

(defn odd-number-of-records? [filename] 
    (let [txt (slurp filename)] 
    (when (seq txt) 
     (odd? (count (str/split txt #"\|")))))) 
+1

En este caso también se puede simplemente comprobar el recuento de la cadena de entrada. '(let [...] (when (pos? (count txt)) ...))' Esto me parece un poco más limpio, porque no asigna innecesariamente un objeto seq que se descarta de inmediato. 'seq' en una estructura de datos es costoso en comparación con' count'. – kotarak

Cuestiones relacionadas