我的问题是对此问题的跟进:No return on command line when running Ruby script因为答案没有提供解释:
使用以下文件script.rb
:
def hello(names)
names.map {|name| "#{name} is awesome!"}
end
hello(["mark", "tony", "scott"])
使用ruby script.rb
在命令行上执行文件时,不会出现以下函数的返回值。但是,在IRB中测试方法或通过PRY输入代码会输出显式返回值。为什么通过脚本执行不能看到返回值?
P.S。我知道使用puts
会将代码输出到终端,但我对为什么返回值不输出感兴趣。
答案 0 :(得分:2)
因为 IRB 或 Pry 都是http://api.jquery.com/off/
REPL 代表:阅读,评估,打印和循环。这正是 Pry 和 IRB 正在做的事情。
他们将首先阅读您的输入,评估您的代码,打印代码执行的结果,然后重新开始。
答案 1 :(得分:1)
Ruby脚本不能像您希望的那样直接返回值,Bash shell以相同的方式工作,Bash函数不能直接返回字符串。您可以返回一个字符串(带有stdout)并将其分配给变量。
~:$~ cat scr.rb
~:$~ puts "Something here"
~:$~ echo $(ruby ./scr.rb)
Something here
~:$~ myvar=$(echo $(ruby ./scr.rb))
~:$~ echo $myvar
Something here
答案 2 :(得分:0)
当我开始编码时,我自己也有同样的问题。如果仔细查看代码,就可以看出它为什么不打印任何东西。你实际上并没有在你的代码中询问它。想象一下,拥有数千行的巨大脚本,你想要执行它。如果ruby myscript.rb
的工作方式与REPL相同,那么您将拥有数百万无意义的输出。
此外,如果您确实希望它以这种方式工作,您只需要在REPL会话(require_relative 'your_script'
)内部执行脚本,然后如果您调用函数hello
它将会工作你描述的方式。
答案 3 :(得分:0)
这很简单:Bash(或者你正在使用的shell)和Ruby是不同的编程语言。 Bash对Ruby一无所知。它不知道什么是“Ruby返回”,它不知道什么是“Ruby数组”,它不知道什么是“Ruby字符串”。因此,您只需就不可能将Ruby对象返回给Bash。
实际上,shell通常只使用一些操作系统函数来执行Ruby脚本(例如经典fork
和exec
或类似vfork
或clone
的内容。如果你想以这种方式返回值,操作系统内核就必须知道有史以来发明的每种编程语言的语义,以及将来会发明的每种编程语言。这是不可行的。
请注意,命令可以向shell返回一个值,即0到255之间的整数,用作状态代码(0表示“成功”和非零)意思是“错误”),您可以通过调用Kernel#exit
来设置该返回值。
答案 4 :(得分:0)
我可以使用 ruval
宝石。它评估每个语句并返回其值。
$ ruval names.rb
def hello(names)
names.map {|name| "#{name} is awesome!"}
end
=> hello
hello(["mark", "tony", "scott"])
=> ["mark is awesome!", "tony is awesome!", "scott is awesome!"]