我的变量牌有空值:
(def cards [0 0 0])
我试图在功能中将卡的值(取决于输入)设置为3。 这就是为什么我有以下代码:
(defn parse-int [s]
(Integer. (re-find #"\d+" s )))
(defn changevalue [] (assoc cards (parse-int (read-line)) 3))
(changevalue)
但是当我在输入1中执行问题和打字时,该功能不会改变键1的值,当我打印它时,它仍然是0 0 0。我该如何解决?
我确定parse-int有效,我从In Clojure how can I convert a String to a number?
得到它答案 0 :(得分:4)
首先,只需使用Integer/parseInt
来解析输入:
(defn change-value [cards]
(let [s (read-line)]
(assoc cards (Integer/parseInt s) 3)))
此函数返回cards
的副本,其中一个元素已更改。请记住,cards
是一个向量,它是不可变的。
一旦创建,您就无法更改它。
您写道“该功能不会更改键1的值,当我打印它时,它仍然是0 0 0。我该如何解决这个问题?”你没有解决它,你拥抱不变性。不要试图更改cards
。使用change-value
返回的修改后的副本:
(def cards [0 0 0])
(def changed-cards (change-value cards))
(println cards)
(println changed-cards)
如果你真的,真的,真的需要可变性,你可以使用atom
,但这不应该是你的第一选择。 Clojure是一种强调不变性的功能语言。顺其自然而不是试图与语言作斗争。
答案 1 :(得分:1)
Clojure的数据结构几乎是不可变的。 在clojure中,严格限制替换变异值。 如果您想要可变数据结构,可以使用Java的可变数据结构或clojure的{atom,ref,var}。
如果你真的想改变卡片,请尝试这样做:
(def cards (atom [0 0 0]))
(defn change-cards! [idx] (swap! cards assoc idx 3))
(change-cards! 2)
@cards
#_"here is no parseint to simplify your problem"