Map var可以是映射中的键吗?
在本例中,我已经创建了varMap var可以是映射中的键吗?,map,clojure,Map,Clojure,在本例中,我已经创建了varnextStudentNumber,我希望映射在学生身上更改的键 (def nextStudentNumber 1000) (defn s [lastName firstName] (let [student {:nextStudentNumber {:lastName lastName :firstName firstName
nextStudentNumber
,我希望映射在学生身上更改的键
(def nextStudentNumber 1000)
(defn s
[lastName firstName]
(let [student {:nextStudentNumber {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}}]
我想您希望将其转换为如下内容:
{:nextStudentNumber {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
在这种情况下,您需要:
{:1000 {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
还有一些其他臭味的东西,比如骆驼壳和inc
。我们在clojure中使用悬浮蛇,因此lastName
将是lastName
。我不知道你在用inc
做什么,但它发出了强烈的命令式的氛围
我想您希望将其转换为如下内容:
{:nextStudentNumber {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
在这种情况下,您需要:
{:1000 {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
还有一些其他臭味的东西,比如骆驼壳和inc
。我们在clojure中使用悬浮蛇,因此lastName
将是lastName
。我不知道你在用inc
做什么,但它发出了强烈的命令式的氛围
我想您希望将其转换为如下内容:
{:nextStudentNumber {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
在这种情况下,您需要:
{:1000 {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
还有一些其他臭味的东西,比如骆驼壳和inc
。我们在clojure中使用悬浮蛇,因此lastName
将是lastName
。我不知道你在用inc
做什么,但它发出了强烈的命令式的氛围
我想您希望将其转换为如下内容:
{:nextStudentNumber {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
在这种情况下,您需要:
{:1000 {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
还有一些其他臭味的东西,比如骆驼壳和
inc
。我们在clojure中使用悬浮蛇,因此lastName
将是lastName
。我不知道你在用inc
做什么,但它发出了强烈的命令性的振动。是的,就像任何对象一样,var可以是地图中的一个键:
{(keyword (str nextStudentNumber)) {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
由于这对您没有帮助,下面是您的问题的示例构造:
{#'foo 42}
=> {#'user/foo 42}
请注意,这个示例有点多余(因为可以通过使用索引调用向量来直接在向量中执行索引查找)
然而,它展示了处理不可变数据的基本思想:在独立的步骤中生成ID并进行分组。您可以通过多种方式组合这些步骤,例如为新学员生成ID,将他们添加到现有学员的集合中,并按ID对他们进行分组。请注意,(groupby:ID)
step的工作方式与ID的生成方式无关,并且允许两名学生拥有相同ID,然后您可以检测和处理这些ID
命令式方法在功能性Clojure世界中非常不典型。如果您有许多分配学生的函数(在您的想法中应该调用s
),而是让他们变得纯粹,让他们返回学生集合,并给他们命名,如从文件中加载学生
,生成ID
,并使用concat
等结构,进入
组合它们返回的集合,而无需弄乱状态,直到您对学生数据进行I/O
如果出于好奇,您仍然想搞乱状态,那么下面是另一个(相当不规则的)代码示例:
(->> [{:name "Mara"} {:name "Lara"} {:name "Clara"}]
(map-indexed #(assoc %2 :id %1)) ;; assign an ID to each student
(group-by :id)) ;; Create a hash-map where students can be looked up by ID
=> {0 [{:name "Mara, :id 0}], 1 [{:name "Lara", :id 1}]
2 [{:name "Clara", :id 2}]}
例如:
(def student-count (atom 0))
(def students-by-id (atom {}))
(defn add-student! [first-name last-name]
(let [next-id (swap! student-count inc)]
(swap! students-by-id
assoc next-id {:first-name first-name, :last-name last-name
:id next-id})))
正如您所看到的,这里的一切都是一步完成的。是的,就像任何对象一样,变量可以是映射中的键:
{(keyword (str nextStudentNumber)) {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
由于这对您没有帮助,下面是您的问题的示例构造:
{#'foo 42}
=> {#'user/foo 42}
请注意,这个示例有点多余(因为可以通过使用索引调用向量来直接在向量中执行索引查找)
然而,它展示了处理不可变数据的基本思想:在独立的步骤中生成ID并进行分组。您可以通过多种方式组合这些步骤,例如为新学员生成ID,将他们添加到现有学员的集合中,并按ID对他们进行分组。请注意,(groupby:ID)
step的工作方式与ID的生成方式无关,并且允许两名学生拥有相同ID,然后您可以检测和处理这些ID
命令式方法在功能性Clojure世界中非常不典型。如果您有许多分配学生的函数(在您的想法中应该调用s
),而是让他们变得纯粹,让他们返回学生集合,并给他们命名,如从文件中加载学生
,生成ID
,并使用concat
等结构,进入
组合它们返回的集合,而无需弄乱状态,直到您对学生数据进行I/O
如果出于好奇,您仍然想搞乱状态,那么下面是另一个(相当不规则的)代码示例:
(->> [{:name "Mara"} {:name "Lara"} {:name "Clara"}]
(map-indexed #(assoc %2 :id %1)) ;; assign an ID to each student
(group-by :id)) ;; Create a hash-map where students can be looked up by ID
=> {0 [{:name "Mara, :id 0}], 1 [{:name "Lara", :id 1}]
2 [{:name "Clara", :id 2}]}
例如:
(def student-count (atom 0))
(def students-by-id (atom {}))
(defn add-student! [first-name last-name]
(let [next-id (swap! student-count inc)]
(swap! students-by-id
assoc next-id {:first-name first-name, :last-name last-name
:id next-id})))
正如您所看到的,这里的一切都是一步完成的。是的,就像任何对象一样,变量可以是映射中的键:
{(keyword (str nextStudentNumber)) {:lastName lastName
:firstName firstName
:grades {}
:id (inc nextStudentNumber)}
由于这对您没有帮助,下面是您的问题的示例构造:
{#'foo 42}
=> {#'user/foo 42}
请注意,这个示例有点多余(因为可以通过使用索引调用向量来直接在向量中执行索引查找)
然而,它展示了处理不可变数据的基本思想:在独立的步骤中生成ID并进行分组。您可以通过多种方式组合这些步骤,例如为新学员生成ID,将他们添加到现有学员的集合中,并按ID对他们进行分组。请注意,(groupby:ID)
step的工作方式与ID的生成方式无关,并且允许两名学生拥有相同ID,然后您可以检测和处理这些ID
命令式方法在功能性Clojure世界中非常不典型。如果您有许多分配学生的函数(在您的想法中应该调用s
),而是让他们变得纯粹,让他们返回学生集合,并给他们命名,如从文件中加载学生
,生成ID
,并使用concat
等结构,进入
组合它们返回的集合,而无需弄乱状态,直到您对学生数据进行I/O
如果出于好奇,您仍然想搞乱状态,那么下面是另一个(相当不规则的)代码示例:
(->> [{:name "Mara"} {:name "Lara"} {:name "Clara"}]
(map-indexed #(assoc %2 :id %1)) ;; assign an ID to each student
(group-by :id)) ;; Create a hash-map where students can be looked up by ID
=> {0 [{:name "Mara, :id 0}], 1 [{:name "Lara", :id 1}]
2 [{:name "Clara", :id 2}]}
例如:
(def student-count (atom 0))
(def students-by-id (atom {}))
(defn add-student! [first-name last-name]
(let [next-id (swap! student-count inc)]
(swap! students-by-id
assoc next-id {:first-name first-name, :last-name last-name
:id next-id})))
正如你所看到的,一切