当有许多相同类型的地图(比如{:keys [x y]} m
,m0
)时,无法在功能参数中完成解析地图,例如使用m1
。这样做会导致x
和y
被遮蔽。所以这就是我为点 type :
(defn intersection [point0
point1]
(let [x0 (:x point0)
y0 (:y point0)
x1 (:x point1)
y1 (:y point1)]))
实现上述目标的更清洁(更惯用)的方法是什么?我想要一个点始终拥有密钥:x
和:y
,而不是诉诸第一个拥有密钥:x0
和:y0
的点,第二个拥有:x1
}和:y1
。
相同的类型 =“输入映射中的一致名称”
答案 0 :(得分:4)
如果我假设您要求在输入映射中使用一致的名称,那么每个点都有键:x和:y:那么您可以使用其他语法进行映射解构:
int → boolean
{name key-to-use ...}
表单是此表单的快捷方式。
如果这些点作为自己的参数传递:
:keys
如果您传递的是一个点列表,那么您可以嵌套地图和列表解构
user> (def p1 {:x 0 :y 1})
#'user/p1
user> (def p2 {:x -3 :y -8})
#'user/p2
user> (defn example [{x0 :x y0 :y} {x1 :x y1 :y}]
[x0 x1 y0 y1])
#'user/example
user> (example p1 p2)
[0 -3 1 -8]
答案 1 :(得分:2)
您可以选择与键绑定的名称:
Foo
另请参阅Destructuring in Clojure中的以下示例:
(let [{x1 :x y1 :y} m1
{x2 :x y2 :y} m2]
(foo x1 y1 x2 y2))