2017-05-03 91 views
-1

我有两种解决方案可以在Ruby中反转字符串。一个打印真实而另一个打印错误,但是,都打印出我想要的回应。为什么一个解决方案打印真正的其他打印错误?

为什么有人说它是错误的,即使它的结果与打印真实的解决方案的结果相同?

这里是解决方案和测试:

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 

这些测试来检查代码工作。写完你的解决方案之后,他们应该都是正确的。

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("===============================================") 
+0

我看到他们所有返回'true'。你得到了什么? –

+0

使用'new'作为变量的名称是一个非常糟糕的主意。它最终会混淆其他任何使用代码的人,包括你未来的自我。通常,使用更多的描述性名称,例如'new_str'或者甚至无处不在的'retval'。另外,请注意您使用的值的类型:'new.to_s + string [-1,1] .to_s'在字符串上使用了两个'to_s',这是冗余的并浪费了CPU时间。 'string [-1,1]'很尴尬; 'string [-1]'将完成同样的事情。 –

+0

另外,要小心。你的第一个方法是传递传入的字符串。你没有看到传递一个字符串,但是尝试传入一个变量,然后检查它。因此,如果这是故意的,则应在方法名称的末尾使用'!'。 –

回答

1

在你#reverse功能,你正在返回puts new时,你应该只被返回new

正如你可以从下面的例子中看到,puts返回nil它输出到屏幕后:

irb(main): puts 'test' 
test 
=> nil 

如果更改puts new只是new,它像您期望的作品。

除了

你不需要使用显式调用return。在Ruby中,执行的最后一行将被退回,这样你就可以在这两种方法代替这个:

return new 

有:

new 
+0

谢谢! @ The Tin Man 我看到你在说什么,现在我更好地了解在打印到屏幕后puts如何返回nil。 此外,感谢您向我展示如何缩短CPU时间的代码。 – jafoole

0

的问题是,在reverse方法,正在打印的值使用puts方法输出stdout,但不返回它(您的方法改为返回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