Clojure 为什么外部部分中定义的变量在内部扇区中不可用?
我有下面的代码,在第二行我在关键字中定义了文件字段,但它只在第3行、第10行和第24行可用,它打印为nil。但是为什么第10,24行可以看到nil,而第3行可以看到非nil值呢?我想他们是一样的Clojure 为什么外部部分中定义的变量在内部扇区中不可用?,clojure,Clojure,我有下面的代码,在第二行我在关键字中定义了文件字段,但它只在第3行、第10行和第24行可用,它打印为nil。但是为什么第10,24行可以看到nil,而第3行可以看到非nil值呢?我想他们是一样的 (defn load-file-to-database [file-name file-id constraints-map auto-creation-config delimiter] (let [file-fields-in-keyword (get-file-header-as-key-wo
(defn load-file-to-database [file-name file-id constraints-map auto-creation-config delimiter]
(let [file-fields-in-keyword (get-file-header-as-key-word file-name)]
(println file-fields-in-keyword)
(with-open [rdr (io/reader file-name)]
(doseq [chunk (partition-all 10000 (map-indexed
(fn [index line] (str file-id delimiter (inc index) delimiter line))
(line-seq rdr)
))]
(println (count chunk))
(println file-fields-in-keyword) ;; it prints nil
(println (first chunk))
(let [rows (map #(clojure.string/split % #",") chunk)
rows-map (map #(zipmap file-fields-in-keyword %) rows)
rows-after-validation (map #(process-row % constraints-map auto-creation-config) rows-map)
valid-records (valid-lines rows-after-validation)
invalid-records (invalid-lines rows-after-validation)
]
(println (count valid-records))
(println (count invalid-records))
(println (first valid-records))
(println (first invalid-records))
(println "xxx")
(println file-fields-in-keyword) ;; it prints nil
(apply (partial j/insert! postgres-db 'test_clojure file-fields-in-keyword) valid-records)
)))
)
)
(defn get-file-header-as-key-word [file-name]
(with-open [rdr (io/reader file-name)]
(println (map keyword (str/split (str row_number "," "file_id" "," (first (line-seq rdr))) #",")))
))
(load-file-to-database file-name 100 constraints-map auto-creation-config ",")
您是正确的,这三个值应该是相同的 函数
get file header作为关键字
返回的值总是nil
,因为println
总是返回该值,所以对println
的所有三个调用都应该将nil
打印为关键字中文件字段的值
要从get file header as key word
函数中获取非nil
值,需要删除对println
的调用。这将导致load file to database
中println
的所有输出都是相同的非nil
值