Java 在字符串问题中替换名称需要帮助(clojure)
我在为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" "
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“一个给”(或者叫“你”)”,一个给我)。