初学红宝石流量控制

时间:2014-05-08 15:50:33

标签: ruby

为什么我对以下代码出错?

def test(s)
   tester = s.split(//)
   for char in tester
       if char != 1 or char != 0
          return false
       end  
   end
   return true
end 

puts test("11111000")
# => false

提前感谢您的回答!

5 个答案:

答案 0 :(得分:5)

这是因为char != 1 or char != 0总是true。无论char是什么,它都不能同时为10


以下内容仅基于对OP代码目的的猜测。如果目的是检查s是否只包含"1""0",那么,我会这样做:

s !~ /[^01]/

答案 1 :(得分:2)

如果您要检查字符串是否仅由1和0组成,您可以这样做:

def test(s)
 s.scan(/[^0-1]/).length == 0
end 

puts test("11111000") # => true
puts test("1234") # => false
puts test("234") # => false

答案 2 :(得分:2)

你在这里所做的是充满了简单的错误,可能是从其他语言带来的假设。

for语句几乎从未使用过。相反,你只需迭代:

tester.each do |char|
  # ...
end

其次,字符串和数字不等同,永远不会自动转换。你必须明确:

if (char == '1' or char == '0')
  # ...
end

此外,您还有一个逻辑错误,您正在以错误的方式进行测试。这两个条件永远不会同时发生,因为没有任何字符会通过两个测试。任何通过一个的东西都会自动失败另一个。

你想要的是什么:

unless (char == '1' or char == '0')
  # ...
end

最后,如果您只是测试此字符串是否仅包含10,那么只需使用简单的正则表达式:

def test(s)
  !!s.match(/\A[01]*\z/)
end

!!双重否定是将潜在的正则表达式匹配转换为简单的truefalse值。这就是你所需要的。 \A\z分别用于定义字符串的“开头”和“结尾”。如果你不熟悉正则表达式,你应该花一些时间来学习它们,因为它们非常强大并且非常简单地执行这些任务。

答案 3 :(得分:1)

char是一个字符串,因此它永远不会等于10 - 仅"1""0"

此代码可以使用:

def test(s)
   tester = s.split(//)
   for char in tester
       if char != '1' and char != '0'
          return false
       end  
   end
   return true
end 

puts test("11111000")
# => true
puts test("111110002")
# => false

更简洁的方法是

def test(s)
  s =~ /^[10]*$/
end

答案 4 :(得分:-1)

我不确定这段代码应该做什么,但你已经使用了一些构造,即(即使它们可用)也不会被视为ruby-way:

  • 您使用or代替|| - or通常用于流量控制表示法,并且优先级非常低
  • 您使用for ... in ...代替迭代器
  • 您明确尝试返回true / false,而使用正确的迭代器可以更清晰地完成。{/ li>

更容易阅读和理解的解决方案看起来可能更像:

def test(s)
   s.split(//).any? { |char| char != 1 || char != 0 }
end 

请注意,您的代码存在更多问题(比较字符串与数字并使用始终为真的条件)。