需要帮助替换字符串问题中的名称(clojure)

foo*_*baz 1 java clojure

我正在为 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)

Mar*_*ůda 6

您可以编写多元函数:

(defn two-fer
  ([] (two-fer "you"))
  ([name] (str "One for " name ", one for me.")))
Run Code Online (Sandbox Code Playgroud)