为什么你不能在命令行中看到Ruby脚本的返回值?

时间:2018-01-18 03:16:04

标签: ruby shell irb

我的问题是对此问题的跟进: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会将代码输出到终端,但我对为什么返回值不输出感兴趣。

5 个答案:

答案 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脚本(例如经典forkexec或类似vforkclone的内容。如果你想以这种方式返回值,操作系统内核就必须知道有史以来发明的每种编程语言的语义,以及将来会发明的每种编程语言。这是不可行的。

请注意,命令可以向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!"]