Ruby方法在repl.it中返回结果,但在我运行程序时没有



我对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规范,所以仅仅打印或输入答案是不够的,我需要评估最后一个术语才能得到答案。

Ruby方法自动返回最后一条语句的值。如果您更改
return c.join(' ')

puts c.join(' ')

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

c.join(' ')

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

这是因为repl.it会向您显示语句的结果,而Ruby不会自动这样做。

Ruby可以做到这一点,试着找到一个名为"IRB"(代表"交互式Ruby")的程序。如果你把你的程序放进去,你会得到想要的结果。

虽然你可以看到它真的在返回值:

puts(rev('hello'))

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

在一个无关的注意事项上,这里有一些提示给你:

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

如果你想获得一个方法的返回值,你必须将它存储在一个变量中:

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`

最新更新