【问题标题】:Why one solution prints true when the other prints false?为什么一种解决方案打印为真,而另一种打印为假?
【发布时间】:2017-05-03 17:00:53
【问题描述】:

我有两种解决方案可以在 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("===============================================")

【问题讨论】:

  • 我看到他们都返回true。你得到了什么?
  • 使用new 作为变量名是个非常糟糕的主意。它最终会让其他使用代码的人感到困惑,包括你未来的自己。一般来说,使用更具描述性的名称,例如new_str,甚至是无处不在的retval。另外,请注意您正在使用的值的类型:new.to_s + string[-1, 1].to_s 在字符串上使用两个to_s,这是多余的并且浪费 CPU 时间。 string[-1, 1] 尴尬; string[-1] 将完成同样的事情。
  • 另外,要小心。您的第一种方法是修改传入的字符串。您看不到传递文字字符串,但尝试传入一个变量,然后再检查它。因此,如果这是故意的,您应该在方法名称的末尾使用!

标签: ruby string reverse solution


【解决方案1】:

在您的 #reverse 函数中,您正在返回 puts new,而您应该只返回 new

从下面的例子可以看出,puts 在打印到屏幕后返回 nil:

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

如果您将 puts new 更改为 new,它将按预期工作。

一边

您不需要使用显式的return 调用。在 Ruby 中,将返回执行的最后一行,因此您可以在这两种方法中替换它:

return new

与:

new

【讨论】:

  • 谢谢! @the Tin Man 我明白你在说什么,现在我更好地了解 puts 在打印到屏幕后如何返回 nil 。另外,感谢您向我展示如何缩短 CPU 时间的代码。
【解决方案2】:

问题是在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2020-08-02
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多