Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 为什么外部部分中定义的变量在内部扇区中不可用?_Clojure - Fatal编程技术网

Clojure 为什么外部部分中定义的变量在内部扇区中不可用?

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

我有下面的代码,在第二行我在关键字中定义了文件字段,但它只在第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-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