【发布时间】:2021-03-04 19:47:07
【问题描述】:
我正在为 Clojure 做一个练习题。它应该很简单,但它实际上让我很头疼。 问题描述如下:
Two-fer 或 2-fer 是二合一的缩写。一份给你,一份给我。 给定一个名称,返回一个带有消息的字符串:“一个给 X,一个给我。” 其中 X 是给定的名称。 但是,如果缺少名称,则返回字符串:“一个给你,一个给我。”
这是我尝试过的:
(defn two-fer [& name]
(if (nil? name)
"One for you, one for me."
(str "One for " name ", one for me."
)
)
但是,我最终得到了以下单元测试输出:
预期:(=“一个给 Bob,一个给我。”(two-fer/two-fer “Bob”)) 实际:(not (= "一个给 Bob,一个给我。" "一个给 ("Bob"),一个给我。"))
lein test :only two-fer-test/name-alice-test
(name-alice-test)失败(two_fer_test.clj:9) 预期:(=“爱丽丝一个,我一个。”(二费/二费“爱丽丝”)) 实际:(not (= "一个给 Alice,一个给我。" "一个给 ("Alice"),一个给我。"))
(two-fer-test) 中的错误 (two_fer.clj:5) 预期:(=“一个给你,一个给我。”(二费/二费)) 实际:java.lang.ClassCastException:类 java.lang.String 无法转换为类 clojure.lang.IFn(java.lang.String 位于加载程序“bootstrap”的模块 java.base 中;clojure.lang.IFn 未命名加载器'app'的模块)
我也试过了:
(defn two-fer [& name]
(str "One for " (if (nil? name) "you" name) ", one for me.")
)
(defn two-fer [& name]
(if (nil? name)
"One for you, one for me."
(eval `(str "One for " ~name ", one for me.")
)
)
(defn two-fer [& name]
(if nil? name)
"One for you, one for me."
(clojure.string/replace (str "One for " name ", one for me.") #"\\(?\\"\\)" ""))
)
)
【问题讨论】: