为什么我对以下代码出错?
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
提前感谢您的回答!
答案 0 :(得分:5)
这是因为char != 1 or char != 0
总是true
。无论char
是什么,它都不能同时为1
和0
。
以下内容仅基于对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
最后,如果您只是测试此字符串是否仅包含1
或0
,那么只需使用简单的正则表达式:
def test(s)
!!s.match(/\A[01]*\z/)
end
!!
双重否定是将潜在的正则表达式匹配转换为简单的true
或false
值。这就是你所需要的。 \A
和\z
分别用于定义字符串的“开头”和“结尾”。如果你不熟悉正则表达式,你应该花一些时间来学习它们,因为它们非常强大并且非常简单地执行这些任务。
答案 3 :(得分:1)
char
是一个字符串,因此它永远不会等于1
或0
- 仅"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
请注意,您的代码存在更多问题(比较字符串与数字并使用始终为真的条件)。