我有两种解决方案来反转 Ruby 中的字符串。一个打印 true,另一个打印 false,但是,两者都打印出我想要的响应。
为什么有人说它是假的,即使它的结果与打印正确的解决方案相同?
以下是解决方案和测试:
def reverse(string)
new = ""
i = 0
length = string.length
while i < length do
new = new.to_s + string[-1, 1].to_s
string.chop!
if i >= string.length
break
end
end
puts new
end
def secondreverse(string)
new = ""
i = 0
length = string.length
while i < length do
new = string[i] + new
i += 1
end
return new
end
这些是检查代码是否正常工作的测试。写完你的解决方案后,它们应该全部打印 true。
puts("\nTests for #reverse")
puts("===============================================")
puts(
'secondreverse("abc") == "cba": ' + (secondreverse("abc") == "cba").to_s
)
puts(
'secondreverse("a") == "a": ' + (secondreverse("a") == "a").to_s
)
puts(
'secondreverse("") == "": ' + (secondreverse("") == "").to_s
)
puts("===============================================")
在您的
#reverse
函数中,当您应该返回 puts new
时,您正在返回 new
。
从下面的示例中可以看到,
puts
在打印到屏幕后返回nil:
irb(main): puts 'test'
test
=> nil
如果您将
puts new
更改为 new
,它将按您的预期工作。
旁白
您不需要使用显式的
return
调用。在 Ruby 中,将返回最后执行的一行,因此您可以在这两种方法中替换它:
return new
与:
new
问题是,在
reverse
方法中,您使用 puts
方法将值打印到标准输出,但没有返回它(您的方法反而返回 nil
)。当您比较 nil == "cba"
时,它会返回 false
。您必须返回 new
变量:
def reverse(string)
new = ""
i = 0
length = string.length
while i < length do
new = new.to_s + string[-1, 1].to_s
string.chop!
if i >= string.length
break
end
end
new
end