为两个条件构造一个 if 语句的最佳方法是啥,每个条件都有一个动作,并且两者都有一个动作?
Posted
技术标签:
【中文标题】为两个条件构造一个 if 语句的最佳方法是啥,每个条件都有一个动作,并且两者都有一个动作?【英文标题】:What is the best way to structure an if statement for two conditions with an action each, and an action for both?为两个条件构造一个 if 语句的最佳方法是什么,每个条件都有一个动作,并且两者都有一个动作? 【发布时间】:2011-08-18 02:22:20 【问题描述】:当我有两个条件时,每个条件都有一个动作,如果一个条件为真,两个条件都有一个动作,
有时我会这样做
if (cond1 or cond2)
if (cond1)
do act 1
if (cond2)
do act 2
do always
有时我会这样做
if (cond1)
do act 1
do always
if (cond2)
do act 2
do always
但我真的很想这样做
if (cond1)
do act 1
or if (cond2)
do act 2
then
do always
最后一种方法是否存在于任何语言中,或者是否有处理这种情况的首选方法?
谢谢。
【问题讨论】:
【参考方案1】:我建议如下:
if (cond1)
do act 1
if (cond2)
do act 2
if (cond1 or cond2)
do always
【讨论】:
【参考方案2】:如果你真的需要这个,并且提取公共的很麻烦 东西到另一个函数,你可以使用这样的宏 (未经测试,Common Lisp):
(defmacro cond-any (clauses)
(let ((any-clause (gensym "any")))
`(let ((,any-clause nil))
(cond ,@(mapcar (lambda (clause)
(if (eq (first clause) :any-after)
(setf any-clause (rest clause))
(append clause any-clause)))
clauses)))))
这使您能够做到这一点:
(cond-any (:any-after do-always)
(cond1 do-1)
(cond2 do-2))
关键字:any-after
则表示“如果有任何后续条件
是真的,将其附加在其 then 部分之后”。
【讨论】:
【参考方案3】:尽量选择不涉及重复代码的东西。
这种选择可能是最灵活的,重复最少:
var := false
if (cond1)
do act 1
var := true
if (cond2)
do act 2
var := true
if (var)
do always
您可能会发现想要设置 var 的次数越来越多,或者随着时间的推移,您想要“始终执行”的“ifs”数量会增加。这种方式避免了“复杂”和/或语句。
【讨论】:
【参考方案4】:return unless (cond1 or cond2)
if (cond1)
do_act 1
if (cond2)
do_act 2
do_always
【讨论】:
【参考方案5】:多个 If 语句会导致更多时间消耗,因为每个语句都是单独评估的。为避免这种情况,请使用 if else if 阶梯来减少时间。我的建议:-
if(cond1 AND cond2)
do act 1
do act 2
do always
else if (cond1 OR cond2)
if(cond1)
do act 1
else
do act 2
do always
在您的所有解决方案中,比较次数最少为 2。但在此特定解决方案中,最少为 1 。所以理想情况下,这应该是最合适的。
【讨论】:
我不喜欢这个。逻辑并不简单,大量代码是重复的,并且通常较大的代码大小会比您保存的一个比较更具吸引力......以上是关于为两个条件构造一个 if 语句的最佳方法是啥,每个条件都有一个动作,并且两者都有一个动作?的主要内容,如果未能解决你的问题,请参考以下文章