2014-05-08 59 views
0

为什么我会为以下代码弄虚作假?初学者红宝石流量控制

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 

预先感谢您的回答!

回答

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分别用于定义字符串的“开始”和“结束”。如果你不熟悉正则表达式,你应该花一些时间了解它们,因为它们非常强大,并且可以非常简单地执行这些任务。

+1

'\ Z'有点棘手。 '\ z'是'\ A'的简单对应。 – sawa

+0

好点。编辑。 – tadman

5

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


以下仅基于对OP代码目的的猜测。如果目的是检查是否s包括什么,但"1""0",那么,我会做:

s !~ /[^01]/ 
+2

另外'0'和''0''不是一回事,所以这段代码首先不起作用。 – tadman

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 
+1

@sawa - 当然它是相关的 - 即使他将_or_更改为_and_ –

+1

@sawa,OP代码将始终返回false。实际的解决方案是这个和您的答案的总和。 :) – BroiSatse

+0

@sawa - 我可以说你的解决方案相同。我看到你已经写完了,我选择不重复你所说的话。我添加了工作代码示例,其中包含我们观察结果的解决方案(您似乎忽略了这一点)。 –

-1

我真的不知道这是什么代码是应该做的,但你已经使用一些结构,即(即使它们是可用的)将不被视为红宝石路:

  • 你已经使用or代替|| - or通常用于流量控制的符号,并具有非常低的优先级
  • 你已经使用for ... in ...代替迭代
  • 你明确地尝试返回true/false,同时可以通过使用正确的迭代器以更简洁的方式完成。

解决方案更易于阅读和理解可能会看起来更像是:

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

请注意,有更多的问题与您的代码(比较数字的字符串和使用条件,始终是真实的)指出由他人。

+1

这将始终返回true – BroiSatse

+0

就像原始代码一样,这可能比使用非ruby方式编写更多的问题。 – samuil

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 
+0

'puts test('1110001222334466')#=> true'! – BroiSatse

+0

对。我不确定这里的目标是什么。我只是说,如果目标是要查看字符串CONTAINS 1或0 - 我发布的内容是否会做。 – Kalman

+0

@BroiSatse - 我编辑我的答案只检查1秒和0。 – Kalman