简单的ruby方法

简单的ruby方法,ruby,if-statement,Ruby,If Statement,我对ruby很陌生。你可能觉得这很幼稚,但我不明白这里发生了什么 matched_标准=match_标准(c1、c2) 将“答案为{符合}” def匹配标准(临界值1、临界值2) 如果致命一击1.存在? 放“礼物” 其他的 放“缺席” 结束 返回true,除非crit_val1.present?|暴击2.在场吗? 返回false,除非crit_val1.present?&暴击2.在场吗? 结束 输出: 缺席的 答案是错误的 无论何时调用match_criteria,只要有一个参数是非空值,即条

我对ruby很陌生。你可能觉得这很幼稚,但我不明白这里发生了什么

matched_标准=match_标准(c1、c2)
将“答案为{符合}”
def匹配标准(临界值1、临界值2)
如果致命一击1.存在?
放“礼物”
其他的
放“缺席”
结束
返回true,除非crit_val1.present?|暴击2.在场吗?
返回false,除非crit_val1.present?&暴击2.在场吗?
结束
输出: 缺席的 答案是错误的


无论何时调用
match_criteria
,只要有一个参数是非空值,即条件,请解释

crit_val1.present? || crit_val2.present?
将为
true
,但由于您正在对其求反,因此不会调用第一个return语句

在相同的情况下,第二个条件的计算结果为false,因为您正在对其求反,所以第二个返回成功地返回
false

def match_标准(crit_val1,crit_val2)
#检查#1是否存在?还是空白?
如果致命一击1.存在?
放“礼物”
其他的
放“缺席”
结束
#除非存在(| |)之一,否则返回true
#…或者你可以这样想。。。
#如果两个(&&)都为空,则返回true
返回true,除非crit_val1.present?|暴击2.在场吗?
#返回false,除非两者都存在
#……或者。。。
#如果其中一个为空,则返回false
返回false,除非crit_val1.present?&暴击2.在场吗?
结束

这实际上是一个RubyonRails问题
blank?
present?
是仅在Rails中可用的实例方法,但在标准Ruby库中不可用。

您的问题与Ruby(或Rails)本身无关。这与误解所涉及的逻辑运算符有关,这在任何语言中都是一个问题

考虑这一点:

def test(x, y)
  return true unless x || y
  false unless x && y
end

p test(true, false)  # => false
p test(true, true)   # => nil
p test(false, false) # => true
在第一个测试(
x=true,y=false
)中,第一个条件失败,因为
x | | y
为true(只有当
x | | y
评估为
false
时才会成功,因为您使用的是
除非
而不是
如果
)。第二个条件成功,因为
x&&y
不正确。因此,该方法返回
false

在第二个测试中,两个条件都不成功,因为
x | | y
x&&y
都计算为
true
。(同样,由于您使用的是
除非
而不是
如果
,因此只有当条件的计算结果为
false
)时,该方法才会返回
nil

在第三个测试中,第一个条件成功,因为
x | | y
的计算结果为
false
。因此,该方法返回
false

您不太可能需要这些逻辑条件。首先,您可能不想要一组不涵盖所有可能性的逻辑条件。此外,我不认为有理由使用
,除非
而不是
如果
;看来你不必要地把你的逻辑复杂化了

当然,你还没有解释清楚你在寻找什么样的逻辑条件,所以在某种程度上我们都在玩“盲目机械”。但我的感觉是,您正在尝试检查您的
crit_val1
crit_val2
是否存在,如果存在,则返回
false
。如果是这样,您需要做的就是:

def match_criteria(crit_val1, crit_val2)

    # other stuff

    return false if crit_val1.present? || crit_val2.present?
    true
end

我找不到crit_val2的来源。您的代码似乎丢失了something@rodrigoalvesvieira updated@anothermh我简化了这个问题。这是功能的生产运行代码。
返回true,除非crit_val1.present?|临界值2.present?
相同,如果返回true!(crit_val1.present?| crit_val2.present?}
,这与
返回true if!crit_val1.present?&&!crit_val2.present?
相同。这有帮助吗?如果其中任何一个存在,或者如果两个都存在,这应该是真的吗?您有两个
return
语句,其中只有一个是必需的(并且是隐含的)第三种可能性是,您意外返回
nil