If statement 何时使用;如果;及;什么时候;在Clojure?
什么时候一个比另一个好?If statement 何时使用;如果;及;什么时候;在Clojure?,if-statement,clojure,If Statement,Clojure,什么时候一个比另一个好? 一个比另一个快还是唯一的区别是返回false或nil?当您正好有一个truthy和一个falsy案例并且不需要隐式的do块时,使用if。相反,当您只需处理真实情况和隐式do时,应使用when。在速度上没有区别,这是使用最惯用的风格的问题 (if (my-predicate? my-data) (do-something my-data) (do-something-else my-data)) (when (my-predicate? my-d
一个比另一个快还是唯一的区别是返回false或nil?当您正好有一个truthy和一个falsy案例并且不需要隐式的
do
块时,使用if
。相反,当您只需处理真实情况和隐式do
时,应使用when
。在速度上没有区别,这是使用最惯用的风格的问题
(if (my-predicate? my-data)
(do-something my-data)
(do-something-else my-data))
(when (my-predicate? my-data)
(do-something my-data)
(do-something-additionally my-data))
在
if
情况下,如果my predicate?
返回真实结果,则只运行do something
,而在when
情况下,执行做某事
和另外做某事
。当有两个不同的表达式时,使用if
:fortrue
子句和forfalse
子句
when
和when not
在两种情况下有用:
- 当您想要有条件地执行一个或多个(隐式
help)非纯操作时李>do
- 当某个谓词的计算结果为
(如果为true
则为
,如果为false
),并且在相反的情况下返回则为not
nil
唯一的区别是返回false或nil
false
和nil
之间没有重大区别,因为两者在逻辑上下文中的计算结果都是false
。我注意到在Clojure和Common Lisp中使用时,在风格上存在差异。在CL中,有些人认为在时使用<代码>是不好的,如果您在测试失败时关心返回值;在这种情况下,您应该在if
的最后一个子句中显式返回nil
。在同样的情况下,在Clojure中使用是很有意义的,因为大多数代码在Clojure中都是纯功能性的:返回值很少被忽略。如果Clojure程序员遵循CL约定,when
很少用于纯函数式代码。(偶尔nil
vs.false
很重要。)@Mars,有趣的是,Clojure中false
和nil
共存的真正原因是什么?我想不出什么情况下,false
可以做nil
做不到的事情。我想大概的意思是:nil
表示“序列中没有剩余内容”,而false
只是表示false。nil
也意味着false,这一事实允许简单地测试序列的结尾。此外,您还可以执行类似于(get{:a1:bnil}:c false)
的操作。更多的讨论,还有:因为nil
意味着“空序列”和false,所以next
和rest
在应用于nil
时有意义,但在应用于false
时抛出异常。nil
的其他有趣用法包括,它可以像谓词一样工作,因为它在失败时返回nil,但实际上不是谓词(因此它的名称中没有“?”),和(请参见文档页)。然而,我不完全理解为什么Clojure在CL中同时具有nil
和false
@Mars,建议与Clojure基本相同,参见和。从后者来看:除非要强调返回值,否则不要将2参数IF或3参数IF
与第二个参数NIL
一起使用;当
和时使用,除非
。当IF子句嵌入到SETQ
中时,您需要强调返回值,例如(SETQ X(IF(EQ Y Z)2 NIL))
。如果我只需要处理真实情况,而不需要隐式do
,在这种情况下使用它会更为常规吗?使用when
。do
部分是选择when
而不是if
的另一个很好的理由,而不是必要的先决条件。