2011-05-03 30 views
1

当我有两个条件,为每个条件的动作,而这两种情况的行动,如果有一个为真,什么是最好的方式来构建一个if语句的两个条件,每个动作都有一个动作?

有时候,我这样做

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 

最后一种方法是否以任何语言存在,或者是否存在处理这种情况的首选方法?

谢谢。

回答

5

我建议如下:

if (cond1) 
    do act 1 
if (cond2) 
    do act 2 
if (cond1 or cond2) 
    do always 
1

如果你真的需要这一点,这是笨拙的共同 事情提取到其他功能,你可以使用宏这样 (未经测试,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则意味着“如果任何后续条件 为真,则在其后部分后追加”。

+0

拧规矩,我有LISP – hugomg 2011-05-04 01:32:02

0
return unless (cond1 or cond2) 
if (cond1) 
    do_act 1 
if (cond2) 
    do_act 2 
do_always 
0

多个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。所以理想情况下,这应该是最合适的。

+0

我不喜欢这个。逻辑不是很顺畅,很多代码都是重复的,并且通常较大的代码大小会比您保存的一个比较多得多... – hugomg 2011-05-04 01:29:30

+0

Yup thats true :( – NirmalGeo 2011-05-04 01:33:10

1

首选尽可能不涉及重复代码的内容。

这种替代可能是最灵活的,以最小的重复:

var := false 

if (cond1) 
    do act 1 
    var := true 

if (cond2) 
    do act 2 
    var := true 

if (var) 
    do always 

您可能会发现,有一些你想VAR集多次,或随着时间的推移和“如果”的数量你想“永远做”增长。这样避免了“复杂”和/或陈述。

相关问题