为什么可以';在命令行中看不到Ruby脚本的返回值吗?

为什么可以';在命令行中看不到Ruby脚本的返回值吗?,ruby,shell,irb,Ruby,Shell,Irb,我的问题是这个问题的后续:因为答案没有提供解释: 获取以下文件,script.rb: def hello(名称) names.map{| name |“{name}太棒了!” 结束 你好([“马克”,“托尼”,“斯科特]) 在命令行上使用ruby script.rb执行文件时,以下函数的返回值不会出现。但是,在IRB中测试该方法,或者使用PRY插入代码中,会输出一个显式的返回值。为什么通过脚本执行返回值不可见 另外,我知道使用put会将代码输出到终端,但我感兴趣的是return值为什么不输出。

我的问题是这个问题的后续:因为答案没有提供解释:

获取以下文件,
script.rb

def hello(名称)
names.map{| name |“{name}太棒了!”
结束
你好([“马克”,“托尼”,“斯科特])
在命令行上使用
ruby script.rb执行文件时,以下函数的返回值不会出现。但是,在IRB中测试该方法,或者使用PRY插入代码中,会输出一个显式的返回值。为什么通过脚本执行返回值不可见


另外,我知道使用
put
会将代码输出到终端,但我感兴趣的是return值为什么不输出。

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

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

因为IRBPry都是

REPL代表:阅读评估打印循环。这正是PryIRB正在做的事情


他们将首先读取您的输入,评估您的代码,打印代码执行的结果,然后重新开始。

因为IRBPry都是

REPL代表:阅读评估打印循环。这正是PryIRB正在做的事情


他们将首先读取您的输入,评估您的代码,打印代码执行的结果,然后重新开始。

我在开始编码时也有同样的问题。如果你仔细看看你的代码,你就会明白为什么它不打印任何东西。实际上,您在代码中没有要求它。想象一下,有一个数千行的巨大脚本,你想要执行它。如果
ruby myscript.rb
与REPLs的工作方式相同,那么您将有数百万个无意义的输出


此外,如果您确实希望它以这种方式工作,您只需在REPL会话中需要脚本(
require\u relative“your\u script”
),然后如果您调用函数
hello
,它将以您描述的方式工作。

我在开始编码时也曾遇到过同样的问题。如果你仔细看看你的代码,你就会明白为什么它不打印任何东西。实际上,您在代码中没有要求它。想象一下,有一个数千行的巨大脚本,你想要执行它。如果
ruby myscript.rb
与REPLs的工作方式相同,那么您将有数百万个无意义的输出

此外,如果您确实希望它以这种方式工作,您只需在REPL会话中需要脚本(
require\u relative“your\u script”
),然后如果您调用函数
hello
,它将以您描述的方式工作。

非常简单:Bash(或您正在使用的任何shell)和Ruby是不同的编程语言。Bash对Ruby一无所知。它不知道什么是“Ruby返回”,不知道什么是“Ruby数组”,不知道什么是“Ruby字符串”。因此,您根本不可能将Ruby对象返回给Bash

事实上,shell通常只使用一些操作系统函数来执行Ruby脚本(例如经典的
fork
exec
或类似的
vfork
clone
)。如果您想以这种方式返回值,操作系统内核必须了解曾经发明的每种编程语言以及将来将发明的每种编程语言的语义。这是不可行的

请注意,命令可以向shell返回一个值,即一个介于0和255之间的整数,用作状态代码(0表示“成功”,非零表示“错误”),您可以通过调用
Kernel#exit

来设置该返回值。它非常简单:Bash(或您正在使用的任何shell)和Ruby是不同的编程语言。Bash对Ruby一无所知。它不知道什么是“Ruby返回”,不知道什么是“Ruby数组”,不知道什么是“Ruby字符串”。因此,您根本不可能将Ruby对象返回给Bash

事实上,shell通常只使用一些操作系统函数来执行Ruby脚本(例如经典的
fork
exec
或类似的
vfork
clone
)。如果您想以这种方式返回值,操作系统内核必须了解曾经发明的每种编程语言以及将来将发明的每种编程语言的语义。这是不可行的

请注意,命令可以向shell返回一个值,即一个介于0和255之间的整数,用作状态代码(0表示“成功”,非零表示“错误”),您可以通过调用
Kernel#exit

设置该返回值。我可以使用gem。它计算每个语句并返回其值

$ruval names.rb
def你好(姓名)
names.map{| name |“{name}太棒了!”
结束
=>你好
你好([“马克”,“托尼”,“斯科特])
=>[“马克太棒了!”托尼太棒了!“斯科特太棒了!”
我可以使用gem。它计算每个语句并返回其值

$ruval names.rb
def你好(姓名)
names.map{| name |“{name}太棒了!”
结束
=>你好
你好([“马克”,“托尼”,“斯科特])
=>[“马克太棒了!”,“托尼太棒了