所以我有一个函数,我正在做两个if语句,第一个似乎正在工作,但第二个是产生错误
ClassCastException java.lang.String cannot be cast to clojure.lang.IFn user/sort-maps (NO_SOURCE_FILE:1559)
该函数传入两个Map“m1 + m2”和两个字符串“s1 s2”
问题是:
(if-not (= (get map1 s2)(s1))
我想要做的是看看字符串“s1”是否等于“map s2”中值的字符串,但我不断收到该错误。这是我的功能
(defn sort-maps [map1 map2 s2 s1]
(if-not (contains? map1 s2)
[(assoc map1 s2 s1) map2]
[map1 (assoc map2 s2 s1)])
(if-not (= (get map1 s2)(s1))
[(dissoc map2 (get map1 s2))]
[map1 (assoc map2 s2 s1)]))
我的意见:
"door" "rood" "odor" "pen" "list" "silt" "#"
我想要的输出是:
{"enp" "pen"}
因为我只想在输入
中返回不能组成任何其他单词的单词答案 0 :(得分:2)
s1
是一个字符串,但通过将其包装在parens中,您可以进行函数调用。字符串不是一个函数,因此您可以看到类型错误。
您可能需要(if-not (= (get map1 s2) s1))
但你似乎有更深层次的误解。 Clojure数据结构不可变。这意味着以下内容:
user=> (def my-map {:a 1 :b 2})
#'user/my-map
user=> (assoc my-map :c 3)
{:a 1, :b 2, :c 3}
user=> my-map
{:a 1, :b 2}
user=> (dissoc my-map :a 1)
{:b 2}
user=> my-map
{:a 1, :b 2}
因此,您无法像使用ruby或其他语言那样更改值。
答案 1 :(得分:2)
(s1)
告诉Clojure将s1
作为一个没有参数的函数调用。但是,即使在修复此问题之后,您的代码也不太可能按照您的预期执行。
这是函数sort-maps
的主体(带有munk的更正):
(if-not (contains? map1 s2)
[(assoc map1 s2 s1) map2]
[map1 (assoc map2 s2 s1)])
(if-not (= (get map1 s2) s1)
[(dissoc map2 (get map1 s2))]
[map1 (assoc map2 s2 s1)])
执行第一个if-not
语句并生成结果(一对更新的map1
和map2
或一对map1
并更新map2
)被扔掉了。由于Clojure中的映射是不可变的,assoc
不会在现有映射中添加新条目 - 而是创建新映射。所以,这个函数体完全等同于
(if-not (= (get map1 s2) s1)
[(dissoc map2 (get map1 s2))]
[map1 (assoc map2 s2 s1)])
我不确定你在这做什么,所以无法帮助你。