假设我想命名一个变量seq
,指的是某种序列。
但是seq
已经是 中的一个函数clojure.core
,所以如果我尝试命名我的变量seq
, 的现有含义seq
将被覆盖。
Clojure 中是否有一种规范的方式来命名一个变量,否则该变量会与默认变量发生名称冲突?
(例如,在这种情况下,my-seq
可以使用,但我不知道就风格而言这是否是标准的)
如果它只是一个事物的函数,我通常只是将它命名为arg
。有时,人们使用缩写,例如x
表示单个事物和事物xs
的序列、列表或向量。
对于小代码片段,缩写为“长”名称的第一个字母通常就足够了。例如,当循环映射时,每个 MapEntry 通常被访问为:
(for [[k v] some-map] ; destructure key/val into k & v
...)
Run Code Online (Sandbox Code Playgroud)
其他时候,您可以在它前面加上一个像aseq
或的字母the-seq
。
我经常使用的另一个技巧是添加一个描述性后缀,如
name-in
name-full
name-first
Run Code Online (Sandbox Code Playgroud)
(是的,有一个 Clojure 函数name
)。
请注意,如果您确实命名了它seq
,您将创建一个隐藏clojure.core/seq
函数的局部变量(它不会被“覆盖”)。如果阴影的范围有限并且所讨论的名称清晰且适当(key
并且val
通常是这种做法的受害者),我通常只是“让它滑动” 。对于name
,我也可能会忽略 的阴影clojure.core/name
,因为我很少使用该功能。
请注意,您可以隐藏自己的局部变量。这通常可以方便地将数据强制转换为特定格式:
name-in
name-full
name-first
Run Code Online (Sandbox Code Playgroud)
通过隐藏原始items
参数,我们确保数据处于所需的形式,而无需提出两个好的描述性名称。当这种技术并不太适合,我经常回落到后缀把戏,只是他们的名字items-in
和items
或相似。
有时,当需要多个表示时,指示类型的后缀很有价值。例如:
(defn foo
[items]
; assume we need a sorted vector with no duplicates
(let [items (vec (sort (set (items))))]
...))
Run Code Online (Sandbox Code Playgroud)
还有很多其他的可能性。重点是让读者清楚发生了什么,并避免为不知情的人制造陷阱。
如有疑问,请添加更多字母,以便新读者可以清楚地了解正在发生的事情。
归档时间: |
|
查看次数: |
77 次 |
最近记录: |