Ruby方法返回结果是repl.it但不是我运行程序时

时间:2013-08-15 00:38:00

标签: ruby rspec

我对ruby很新,我一直在编写一些简单的程序。我注意到当我尝试通过命令行运行它时,很多程序都没有创建返回值,但是当我使用repl.it进行测试时似乎工作正常。例如:

def rev(a)

b = []

c = []

b = a.scan(/\w+/)

c = b.map {|x| x.reverse }

return c.join(' ')

end

rev('hello')

如果我使用puts c.join(' '),答案将会出现,但不会返回,这是我需要发生的事情。我觉得这很简单。感谢任何帮助,我不得不创建一些奇怪和块状的工作来使我的其他程序工作,但限制了我能够做的事情。

我正在制作这个程序来满足我给出的一些rspec规范,所以简单地打印或给出答案是不够的,我需要将最终术语评估为答案。

3 个答案:

答案 0 :(得分:1)

那是因为repl.it向您显示了语句的结果,Ruby不会自动执行。

Ruby 可以这样做,尝试找到名为“IRB”的程序(代表“Interactive Ruby”)。如果您将程序放入其中,您将获得所需的结果。

虽然您可以看到它确实返回了值:

puts(rev('hello'))

repl.it只是自动显示最后一个表达式的结果。

在一个不相关的说明中,这里有一些提示:

  • 使用缩进 - 在您的代码中很难看到哪些行属于该函数
  • 为变量描述名称命名,以便在稍后阅读代码时知道它们的用途
  • 您不需要键入return,因为Ruby会自动返回最后一个语句

答案 1 :(得分:1)

Ruby方法自动返回最后一个语句的值。如果你改变了

return c.join(' ')

puts c.join(' ')

它会尝试返回puts的返回值,这不是您想要的。顺便说一下,在这种情况下你可以省略return。简单地说

c.join(' ')

作为最后一个语句,该方法将使用它作为返回值。

答案 2 :(得分:0)

如果要获取方法的返回值,则必须将其存储在变量中:

answer = rev('hello')

如果你想看到答案 - 正如你在IRB中所做的那样(“repl”)那么你必须要求Ruby输出它:

p answer    # Print the result of calling `answer.inspect`
puts answer # Print the result of calling `answer.to_s`