我正在研究clojure的乐趣,并想知道_语法在函数参数向量中的作用。
示例:
(def available-processors
(.availableProcessors (Runtime/getRuntime)))
(prn "available processors: " available-processors)
(def pool
(Executors/newFixedThreadPool (+ 2 available-processors)))
(defn dothreads!
[func & {thread-count :threads exec-count :times :or {thread-count 1 exec-count 1}}]
(dotimes [t thread-count]
(.submit pool #(dotimes [_ exec-count] (func)))))
表格中的下划线是什么:
#(dotimes [_ exec-count] (func))
答案 0 :(得分:17)
我认为按照惯例,在Clojure中使用下划线作为必需但未使用的参数的占位符。正如Keith Bennet所说:
在Clojure中,下划线用于表示 它标识的参数随后未被使用。
你的例子符合这个"用法,"因为dotimes
的第一个参数是一个索引器,所以不需要,但表单需要绑定。
答案 1 :(得分:12)
没有什么特别的,它只是一个命名你不关心的东西的约定,但它仍然是一个名字,可以像普通名字一样使用。
(defn hello [_] (+ 1 _))
(hello 10)
<强>更新强>
这样做:
(defn hello [a a] (+ a a))
不会产生错误,因此您可以根据需要使用多个_。)。
注意:上面不是Scheme或CL的情况......那么在clojure背后的理性是什么呢?
答案 2 :(得分:0)
以前的答案很好,但是由于我需要进一步澄清,所以这是我的答案。
java.lang.IllegalStateException: No instance for key AttributeKey: userK
与
相同(defn blah[_] (str "the value you sent is " _)
没有区别。 _只是一种让查看代码的人知道不打算使用该参数的方法。
例如,这在编程上很好:
(defn blah[my-arg] (str "the value you sent is " my-arg)
但是看代码的人会认为您不打算使用_。因此,为了清楚起见,最好使用'n'或'ind'或其他名称而不是_。如果您不使用该值,如下所示...
(dotimes [_ 5] (println (str "I'm going to print this 5 times, and this is index # " _)))
然后将其绑定到_,因为这表明您没有使用它。
还有最后一件事,如果绑定具有相同的名称,则最后一个赢。因此,以下将打印“ 4last4last4last4last”。
(dotimes [_ 5] (println "I'm going to print this 5 times"))
因此在println块中,“ _”绑定到4,而“ a”绑定到“ last”。先前发送的所有值都会被忽略/覆盖。