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