2014-09-22 54 views
0

我想不出如何正确编写规则使用&&和||的ruby条件

我想表达以下规则:

如果结论是“负面”的前提之一必须为负。

下面是我试图写这个。

def test4b 
    if (@conclusion.getQuality == 'negative' && (@major.getQuality != 'negative' || @minor.getQuality != 'negative')) 
    validity = "invalid (4b) Negative conclusion without a negative premise" 
    else 
     validity = "pass" 
    end 
end 

但是这不起作用。它似乎排除了所有三段论的负面前提。再次,我只想排除那些没有任何负面前提的负面结论的三段论。

+0

在Ruby中,你应该使用'方法名称snake_case'和省略'GET'前缀对于获得者,即'@conclusion.quality =='negative''或者更好的判断方法:'@ conclusion.negative?' – Stefan 2014-09-22 12:07:15

回答

0

它应该是:的

if (@conclusion.getQuality == 'negative' && (@major.getQuality != 'negative' && @minor.getQuality != 'negative')) 

两个@major@minor不为 '负面'。 您的方法是重试!conclusion => (!major || !minor)的逻辑值。该表达式的否定将为:

!conclusion && !(!major || !minor) <=> !conclusion && major && major 

(德摩根定律)。这是您正在寻找的条件,请注意这里没有||

另外请注意,如果你这样做会更可读,但:

if (@conclusion.getQuality == 'negative' && [@major, @minor].all? {|m| m.getQuality != 'negative'}) 

if (@conclusion.getQuality == 'negative' && ![@major, @minor].any? {|m| m.getQuality == 'negative'}) 
+2

我认为另一种选择是'[@major,@minor] .none? {| M | m.getQuality =='negative'}',它基本上很好地反映了自然语言。 – 2014-09-22 11:33:49