为什么一个解决方案打印为真而另一个解决方案打印为假?

Why one solution prints true when the other prints false?

我有两个解决方案来反转 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

这些是检查代码是否正常工作的测试。写完你的解决方案后,它们都应该打印为真。

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 函数中,您在应该返回 new 时返回 puts new

正如您从下面的示例中看到的,puts returns 打印到屏幕后为 nil:

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

如果您将 puts new 更改为 new,它会如您所愿地工作。

一边

您不需要使用显式 return 调用。在Ruby中,最后执行的一行会被返回,所以你可以在这两个方法中替换为:

return new

与:

new

问题是在 reverse 方法中,您正在使用 puts 方法将值打印到标准输出,但您没有 returning 它(您的方法 returns nil 代替)。当你比较 nil == "cba" 时,它 returns false。您必须 return 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