对于某些参数,返回true而不是false的方法

时间:2017-07-20 14:04:51

标签: ruby

嗨我有一个方法XO

    如果字符串具有相同数量的' x'

    ,则
  • 返回 true

  • 如果x比o更多,则返回 false ,反之亦然

  • 当没有x和o时,
  • 返回 true

这些应该是正确的测试:

XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false

出于某种原因,我的方法总是返回true,我不明白为什么。

def XO(str)
   x = str.count("o" "O") 
   y = str.count ("x" "X")
    if x == y
     true
    elsif
     str.split.select { |x| !x.include?("o" "O") && !x.include?("x" "X") }
     true
    else
     false
    end
end

我是ruby的新手,为我的破旧代码道歉。

2 个答案:

答案 0 :(得分:3)

您的代码存在的问题是这一行:

str.split.select { |x| !x.include?("o" "O") && !x.include?("x" "X") }
在字符串没有'x'或'o'的情况下,

将返回一个空数组[]。在Ruby中,任何数组都被认为是真实的,甚至是空的数组。所以你的代码总是在这里返回true。您可以通过检查数组是否为空来修复它:

def XO(str)
   x = str.count("o" "O") 
   y = str.count ("x" "X")
    if x == y
     true
    elsif
     str.split.select { |x| !x.include?("o" "O") && !x.include?("x" "X") }.empty?
     true
    else
     false
    end
end

此代码可以正常运行并执行您想要的操作。但是,它太复杂了!如果你看看你的要求:

    如果字符串具有相同数量的'x'和'o's ,则
  • 返回true 如果x比o更多,则
  • 返回false,反之亦然
  • 当存在NO x和o时,
  • 返回true。

当没有x和没有o时,你可以说实际上有0 x和0 o,这意味着有'x>和'o'的相同数量。这意味着你可以这样做:

def XO(str)
   x = str.count("o" "O") 
   y = str.count ("x" "X")
   x == y
end

在没有'x'或'o'的情况下,你会0 == 0返回true,就像你想要的那样。

答案 1 :(得分:2)

直接等效测试将满足您的所有条件。

[httpd]
bind_address = 0.0.0.0

为缩进使用两个空格,为方法名称使用小写。注意更紧凑的def xo str str.count("oO") == str.count("xX") end xo "ooxx" #=> true xo "xooxx" #=> false xo "ooxXm" #=> true xo "zpzpzpp" #=> true xo "zzoo" #=> false 参数。