File io 在clojure中,为什么从空文件中拆分字符串会返回1个元素?

File io 在clojure中,为什么从空文件中拆分字符串会返回1个元素?,file-io,vector,clojure,string,File Io,Vector,Clojure,String,考虑以下几点: => (even? (count [])) true 到目前为止还不错。现在考虑(假设我的文件是空的): 呃。。。为什么从空文件返回的向量不是偶数(零) 啊,有人能解释一下为什么在这种情况下返回空字符串吗 我正在尝试确定文件中是否有奇数条记录。clojure.string/split使用java.util.regex.Pattern/split进行拆分。请参阅以获取解释。也就是说,split返回模式第一次匹配之前的所有内容作为第一次分割,即使模式根本不匹配 测试集合(列表

考虑以下几点:

=> (even? (count []))
true
到目前为止还不错。现在考虑(假设我的文件是空的):

呃。。。为什么从空文件返回的向量不是偶数(零)

啊,有人能解释一下为什么在这种情况下返回空字符串吗


我正在尝试确定文件中是否有奇数条记录。

clojure.string/split
使用
java.util.regex.Pattern/split
进行拆分。请参阅以获取解释。也就是说,
split
返回模式第一次匹配之前的所有内容作为第一次分割,即使模式根本不匹配

测试集合(列表、数组、映射、字符串等)是否为空的标准方法是对其调用
seq
,对于空集合,它将返回
nil

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

在这种情况下,还可以简单地检查输入字符串的计数
(让[…](when(pos?(count txt))…)
我觉得这有点干净,因为它不会不必要地分配一个立即丢弃的seq对象<与
count
相比,数据结构上的code>seq成本较高。
=>(str/split (slurp my-file) #"\|")
[""]
(defn odd-number-of-records? [filename]
  (let [txt (slurp filename)]
    (when (seq txt)
      (odd? (count (str/split txt #"\|"))))))