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

Java 在字符串问题中替换名称需要帮助(clojure),java,clojure,Java,Clojure,我在为Clojure做练习题。这应该很简单,但实际上让我头疼。 问题描述如下: user=> (two-fer) "One for you, one for me." user=> (two-fer "John") "One for John, one for me." user=> (two-fer "John" "Paul" "George" "

我在为Clojure做练习题。这应该很简单,但实际上让我头疼。 问题描述如下:

user=> (two-fer)
"One for you, one for me."
user=> (two-fer "John")
"One for John, one for me."
user=> (two-fer "John" "Paul" "George" "Ringo")
"One for John, Paul, George, Ringo, one for me."
两个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."
  )
)
然而,我最终通过以下单元测试输出得到了这个结果:

预期:(=“一个给鲍勃,一个给我。”(两个fer/两个fer“鲍勃”)) 实际:(不是((“一个给鲍勃,一个给我。”“一个给(“鲍勃”),一个给我。”)

lein测试:只有两个fer测试/名称alice测试

失败(名称alice测试)(两次测试。clj:9) 预期:(=“一个给爱丽丝,一个给我。”(两个“爱丽丝”)) 实际:(不是((“一个给爱丽丝,一个给我。”“一个给(“爱丽丝”),一个给我。”)

错误(两次试验)(两次试验:5) 预期:(=“一个给你,一个给我。”(两个fer/两个fer)) 实际: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.")
)

问题在于
&
符号,它将任意数量的参数包装到一个列表/seq中

你可能需要这样的东西:

(defn two-fer
  [& args]
  (let [name (if (empty? args)
               "you"
               (first args))]
    (str "One for " name ", one for me.")))
结果

(two-fer "Bob")  => "One for Bob, one for me."
(two-fer)        => "One for you, one for me."

您也可能对此感兴趣。

问题在于
&
符号,它将任意数量的参数包装到一个列表/seq中

你可能需要这样的东西:

(defn two-fer
  [& args]
  (let [name (if (empty? args)
               "you"
               (first args))]
    (str "One for " name ", one for me.")))
结果

(two-fer "Bob")  => "One for Bob, one for me."
(two-fer)        => "One for you, one for me."

您也可能对此感兴趣。

您可以编写多算术函数:

(defn two-fer
  ([] (two-fer "you"))
  ([name] (str "One for " name ", one for me.")))

您可以编写多算术函数:

(defn two-fer
  ([] (two-fer "you"))
  ([name] (str "One for " name ", one for me.")))
在这种情况下,我总是赞成。然而你的 如果您要对第一个“其余”参数进行解构,则该示例几乎可以工作

(defn two-fer
  [& [name]]
  (if (nil? name)
    "One for you, one for me."
    (str "One for " name ", one for me.")))

(println (two-fer) (two-fer "Bob"))
; → One for you, one for me. One for Bob, one for me.
在这种情况下,我总是赞成。然而你的 如果您要对第一个“其余”参数进行解构,则该示例几乎可以工作

(defn two-fer
  [& [name]]
  (if (nil? name)
    "One for you, one for me."
    (str "One for " name ", one for me.")))

(println (two-fer) (two-fer "Bob"))
; → One for you, one for me. One for Bob, one for me.

重写它以处理传递给它的所有名称:

(defn two-fer [& names]
  (if (nil? names)
    "One for you, one for me."
    (str "One for " (apply str (interpose ", " names)) ", one for me.")
  )
)
测试如下:

user=> (two-fer)
"One for you, one for me."
user=> (two-fer "John")
"One for John, one for me."
user=> (two-fer "John" "Paul" "George" "Ringo")
"One for John, Paul, George, Ringo, one for me."
编辑 因为没有比过度杀戮更好的杀戮:

(defn two-fer [& names]
  (let [all-names (conj (if (nil? names) ["you"] (vec names)) "me")
        comma     (if (< (count all-names) 2) ", " ", one for ")]
    (str "One for "  (apply str (interpose comma all-names)))
  )
)

重写它以处理传递给它的所有名称:

(defn two-fer [& names]
  (if (nil? names)
    "One for you, one for me."
    (str "One for " (apply str (interpose ", " names)) ", one for me.")
  )
)
测试如下:

user=> (two-fer)
"One for you, one for me."
user=> (two-fer "John")
"One for John, one for me."
user=> (two-fer "John" "Paul" "George" "Ringo")
"One for John, Paul, George, Ringo, one for me."
编辑 因为没有比过度杀戮更好的杀戮:

(defn two-fer [& names]
  (let [all-names (conj (if (nil? names) ["you"] (vec names)) "me")
        comma     (if (< (count all-names) 2) ", " ", one for ")]
    (str "One for "  (apply str (interpose comma all-names)))
  )
)
或者
(格式为“一个给%s,一个给我。”(或者叫“你”))
或者
(str“一个给”(或者叫“你”)”,一个给我。”)
或者
(格式为“一个给%s,一个给我。”(或者叫“你”)
或者
(str“一个给”(或者叫“你”)”,一个给我)。