我通过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))
我相信,下划线Clojure中使用,按照惯例,作为一个必需的,但是未使用的参数的占位符。 由于基思班纳特所说的那样:
Clojure中,下划线也被习惯用于指示它标识参数不随后使用。
你举的例子是与此一致“用法”,因为第一个参数dotimes
是不需要的,这是一个索引,而是由表单所需的结合。
什么特别的地方,它仅仅是命名的东西,你不关心的公约,但它仍然是一个名称,可以像一个正常的名称中使用。
(defn hello [_] (+ 1 _))
(hello 10)
UPDATE
这样做:
(defn hello [a a] (+ a a))
不会产生误差,因此,只要你想,你可以使用尽可能多的_)。
注:以上不符合计划或CL的情况......嗯什么用Clojure那么它背后的理性???
以前的答案是好的,但因为我需要一些额外的澄清,这是我的答案。
(defn blah[_] (str "the value you sent is " _)
是相同的
(defn blah[my-arg] (str "the value you sent is " my-arg)
没有区别。 _只是一种让看代码的人都知道,该参数不打算使用。
因此,例如,这是好的编程:
(dotimes [_ 5] (println (str "I'm going to print this 5 times, and this is index # " _)))
但有人看代码会觉得你是不是在使用_规划。 因此,这将更好地使用“n”或“IND”或什么的,而不是_,仅仅是明确的。 如果您没有使用该值,如下面...
(dotimes [_ 5] (println "I'm going to print this 5 times"))
然后,它因为你的参数绑定到_,因为你是表明你不使用它。
还有最后一两件事,如果绑定具有相同的名称,最后一个获胜。 所以下面将打印“4last4last4last4last”。
(defn will-print [_ a _ a _ a _ a] (println (str _ a _ a _ a _ a)))
(will-print 1 "a" 2 "b" 3 "c" 4 "last")
因此,在中的println块“_”势必4,和“一”必然“最后”。 所有发送的先前的值被忽略/覆盖。