coc*_*oco 12 clojure type-conversion
我正在学习Clojure而且我有一个疑问:
为什么当我打字
(map vector '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)
我明白了 (["1"] ["2"] ["3"])
没关系,因为它vector
是一个功能(或者几乎我认为),我可以做到
(vector "3")
并且得到["3"]
.
到目前为止这么好,但是当我尝试的时候
(map Integer/parseInt '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)
我收到一个错误.不应该parseInt
表现得像一个功能?
然后我需要打字
(map #(Integer/parseInt %) '(......
Run Code Online (Sandbox Code Playgroud)
为什么我不能parseInt
像功能一样使用?对我来说这是一个功能,我可以像使用它一样
(Integer/parseInt "3")
Run Code Online (Sandbox Code Playgroud)
我觉得它有点不连贯,但我确定我犯了一些错误,为此,我问它......
nic*_*kik 16
你必须把它包起来#()
或(fn ...)
.这是因为Integer/parseInt是一种Java方法,并且Java方法无法传递.他们没有实现IFn
接口.
Clojure是基于Java构建的,有时这会泄漏,这就是其中一种情况.
正如其他人所说,您需要包装 Integer/parseInt 以便将其从 Java 方法转换为 Clojure 函数:
(map #(Integer/parseInt %) '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)
这样做的原因是 Clojure 函数必须实现 IFn 接口才能作为参数传递到更高阶函数,例如map
.
如果您多次进行这种转换,这有点难看,因此我建议按如下方式包装您的 parse-int 函数:
(defn parse-int [s] (Integer/parseInt s))
(map parse-int '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)
作为最后的选择,您可能希望使用内置的 read-string 函数 - 这将在您的情况下返回整数,但也适用于双打等:
(map read-string '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)