为什么我会为以下代码弄虚作假?初学者红宝石流量控制
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
预先感谢您的回答!
为什么我会为以下代码弄虚作假?初学者红宝石流量控制
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
预先感谢您的回答!
你在做什么这里充满了简单的错误,假设大概带来了来自其他语言。
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
分别用于定义字符串的“开始”和“结束”。如果你不熟悉正则表达式,你应该花一些时间了解它们,因为它们非常强大,并且可以非常简单地执行这些任务。
这是因为char != 1 or char != 0
总是true
。不管char
是什么,它不能同时是1
和0
。
以下仅基于对OP代码目的的猜测。如果目的是检查是否s
包括什么,但"1"
或"0"
,那么,我会做:
s !~ /[^01]/
另外'0'和''0''不是一回事,所以这段代码首先不起作用。 – tadman
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
@sawa - 当然它是相关的 - 即使他将_or_更改为_and_ –
@sawa,OP代码将始终返回false。实际的解决方案是这个和您的答案的总和。 :) – BroiSatse
@sawa - 我可以说你的解决方案相同。我看到你已经写完了,我选择不重复你所说的话。我添加了工作代码示例,其中包含我们观察结果的解决方案(您似乎忽略了这一点)。 –
我真的不知道这是什么代码是应该做的,但你已经使用一些结构,即(即使它们是可用的)将不被视为红宝石路:
or
代替||
- or
通常用于流量控制的符号,并具有非常低的优先级for ... in ...
代替迭代true
/false
,同时可以通过使用正确的迭代器以更简洁的方式完成。解决方案更易于阅读和理解可能会看起来更像是:
def test(s)
s.split(//).any? { |char| char != 1 || char != 0 }
end
请注意,有更多的问题与您的代码(比较数字的字符串和使用条件,始终是真实的)指出由他人。
如果你尝试检查一个字符串仅由1和0组成,你可以做:
def test(s)
s.scan(/[^0-1]/).length == 0
end
puts test("11111000") # => true
puts test("1234") # => false
puts test("234") # => false
'\ Z'有点棘手。 '\ z'是'\ A'的简单对应。 – sawa
好点。编辑。 – tadman