我正在为 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."
)
)
Run Code Online (Sandbox Code Playgroud)
但是,我最终得到了以下单元测试输出:
预期:(=“一个给鲍勃,一个给我。”(两个-fer/两个-fer“鲍勃”))实际:(不是(=“一个给鲍勃,一个给我。”“一个给(“鲍勃”) ),给我一个。”))
lein 测试:只有两个-fer-test/name-alice-test
FAIL in (name-alice-test) (two_fer_test.clj:9) 预期:(=“一个给爱丽丝,一个给我。”(双铁/双铁“爱丽丝”))实际:(不是(=“一个给爱丽丝,一个给我。”“一个给(“爱丽丝”),一个给我。”))
ERROR in (two-fer-test) (two_fer.clj:5) expected: (= "One for you, one for me." (two-fer/two-fer)) 实际:java.lang.ClassCastException: class 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.")
)
Run Code Online (Sandbox Code Playgroud)
(defn two-fer [& name]
(if (nil? name)
"One for you, one for me."
(eval `(str "One for " ~name ", one for me.")
)
)
Run Code Online (Sandbox Code Playgroud)
(defn two-fer [& name]
(if nil? name)
"One for you, one for me."
(clojure.string/replace (str "One for " name ", one for me.") #"\\(?\\"\\)" ""))
)
)
Run Code Online (Sandbox Code Playgroud)
您可以编写多元函数:
(defn two-fer
([] (two-fer "you"))
([name] (str "One for " name ", one for me.")))
Run Code Online (Sandbox Code Playgroud)