Ruby 是否使用 $stdout 来写入 put 和 return 的输出?

2024-03-01

我想知道 Ruby 使用输出流在命令行打印这些内容:

irb(main):001:0> a="test"
=> "test"
irb(main):002:0> puts a
test
=> nil
irb(main):003:0> a
=> "test"

Is $stdout用于irb(main):002:0> and irb(main):003:0>?并且,其值有变化吗?$stdout在这两个调用之间?

另外,有人可以向我指出打印/编写这些内容的 Ruby 源代码吗?


是的。而且很容易向自己测试/证明。在命令行尝试这个:

ruby -e 'puts "foo"' > test.out
cat test.out

输出将是:

foo

Ruby 使用 STDOUT 通道输出到控制台。然后操作系统将该 STDOUT 重定向到“test.out”。

尝试一下:

ruby -e 'STDOUT.puts "foo"' > test.out

你会得到相同的结果。

如果我们这样做:

ruby -e 'STDERR.puts "foo"' > test.out
foo
cat test.out

您将在文件中看不到任何内容,但“foo”将被写入 STDERR 通道上的控制台。

Ruby 定义$stdout作为一个全球性的人,你可以改变,并且STDOUT作为一个常数,你不应该改变它。相似地,$stderr and STDERR可用。

现在,这就是它变得有趣的地方,并证明了你的问题。尝试这个:

ruby -e '$stdout = STDERR; puts "foo"' > test.out

你会得到与我输出相同的结果STDERR,因为,在puts正在使用该值$stdout选择输出流,并写入STDERR。当解释器启动时,Ruby 从操作系统中获取这些流值,并在脚本运行时记住这些值。你可以改变它们如果需要的话当解释器退出时,Ruby 会忘记这些设置,并在下一次将其自身重置为正常状态。

你不应该依赖隐含的/看不见的改变行为$stdout不过,因为这会导致代码非常混乱。相反,我强烈建议使用显式STDERR.puts任何时候你写到 STDERR 和一个裸puts用于正常输出到 STDOUT。如果您将两者的输出混合在一起,那么使用可能会更清楚STDOUT.puts and STDERR.puts,但这就是你的决定。

现在,IRB 与解释器中运行的常规脚本相同,只要使用$stdout因此将 IRB 中的输出写入$stdout工作原理相同:

irb(main):001:0> $stdout
#<IO:<STDOUT>>
irb(main):002:0> $stderr
#<IO:<STDERR>>

And:

irb(main):003:0> $stdout.puts 'foo'
foo
nil
irb(main):004:0> $stderr.puts 'foo'
foo
nil

最后:

irb(main):007:0> $stdout.isatty
true
irb(main):008:0> $stdout.isatty
true

除非我们看得更低一些,否则我们无法真正看出任何区别。它们都是 TTY 通道,具有标准 STDOUT 和 STDERR 通道号:

irb(main):009:0> $stdout.fileno
1
irb(main):010:0> $stderr.fileno
2

希望这有助于“解释它”。


我刚刚意识到 IRB 报告的回报值puts可能会让您感到困惑,导致您认为 STDOUT 正在更改。那nil返回与 STDOUT 或 STDERR 无关。这是因为puts返回 nil,由 IRB 尽职尽责地报告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 是否使用 $stdout 来写入 put 和 return 的输出? 的相关文章

  • 使用“回形针”gem 和 Ruby on Rails 3 时出现问题

    我在运行 Snow Leopard v1 6 5 的 MacO 上使用 Ruby on Rails 3 我想使用 回形针 gem 所以我将它包含在我的 Gemfile 中 如下所示 gem paperclip gt 2 3 然后 在终端中运
  • 在 Ruby 中生成 GUID

    我有一个问题 用 GUID 很容易解决 特别是 对于密码重置工作流程 我想将 GUID 令牌发送到用户的电子邮件并让他们使用该令牌重置密码 由于 GUID 是唯一的 因此这非常安全 并且可以避免我通过电子邮件向人们发送密码 这是有风险的 我
  • 向 Rails 应用程序中的内置类添加方法

    我想向 Rails 应用程序中的 Array 类添加一个方法 我应该把这个方法放在哪里 编辑得更清楚 显然我把它放在某个文件中 但是我如何告诉 Rails 应用程序在哪里可以找到它 执行此操作的一种方法是在以下位置创建一个文件lib rai
  • 不同金额的 Stripe 订阅计划

    我正在为一家慈善机构制作一份捐赠表格 他们要求提供每月捐赠计划 用户可以选择他们想要捐赠的任何金额 我知道我可以制定个人计划 即 如果他们说每月捐款 5 美元 10 美元或 20 美元 我可以制定三个不同的计划并向用户订阅它们 有没有办法避
  • 被一个简单的正则表达式难住了

    我想看看字符串是否s包含正则表达式中的任何符号 下面的正则表达式可以正常工作rubular http rubular com s asd d s 但在 Ruby 1 9 2 中 它给出了以下错误消息 syntax error unexpec
  • 使用 Ruby on Rails 进行设计 - 强制用户在首次登录时更改密码

    我有一个运行 Devise 的 RoR 应用程序 Rails 4 2 Ruby 2 2 0 我已经进行了设置 以便管理员用户 标识了我添加到用户模型中的 is admin 布尔值 能够创建新的用户帐户 为他们提供生成的密码和确认电子邮件 这
  • Ruby 依赖注入库

    我一直在研究一些 Ruby 依赖注入库 特别是 我检查了Needle http needle rubyforge org and Copland http copland rubyforge org 它们已经存在很长一段时间了 但用途并不多
  • 如何使用 Nokogiri 获取某些标签之后或之前的文本

    我有一个 HTML 文档 如下所示
  • gets、gets.chomp 和 gets.chomp 之间的区别!?

    这三者有什么区别 gets 它得到一行带有 n gets chomp 它得到一行 但删除 n 那是对的吗 关于什么gets chomp gets http www ruby doc org core 2 1 0 Kernel html me
  • Ruby 中多维数组的帮助

    我有以下代码将字符串拆分为 3 个字节的组 str hello ix 0 iy 0 bytes tby str each byte do c if iy 3 iy 0 bytes ix tby each index do i bytes i
  • “没有可用的二元红宝石”是什么意思?

    每当我使用rvm install x x x 即使安装成功 我也会收到此警告 No binary rubies available for osx 10 12 x86 64 ruby 2 4 0 Continuing with compil
  • 可以覆盖/实现的 ruby​​ 运算符列表

    是否有可以覆盖的所有 ruby 运算符的列表 不是那些不能的 Here s Ruby 运算符表 http phrogz net programmingruby language html table 18 4 方法和可重载的有 Elemen
  • 有没有人有 Ruby 和 Rake 的 Notepad++ 函数列表插件的解析规则

    我使用 Notepad 编辑 rake 文件 并且希望能够使用函数列表插件 我无法在线找到任何解析规则 并且 语言解析规则 对话框没有非常清晰的记录 我正在将方法解析到以下列表中 但还想显示任务 Function Begin t def t
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • 如何使用本地安装的gems执行Ruby程序?

    我已经使用安装了我的依赖项 bundle package 然后将它们传输到离线服务器并运行 gt bundle install local Using mime types 1 19 Using rest client 1 6 7 Usin
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company

随机推荐

  • 为开发环境分配域名localhost

    我正在构建一个网站 并且不想将网站从指向重新配置为http 127 0 0 1 to http www example com 此外 我使用的证书当然是用正确的域名制作的www example com但我的测试环境会调用127 0 0 1这
  • Apple Web Clip(Apple Touch 图标)不适用于采用 HTTPS 的网站

    当我为网站启用 HTTPS 时 我很难在 Safari 中的 添加书签 功能中显示 Apple Touch 图标 我可以使用 添加到主页 选项来使其工作 所以我不确定是否对 添加书签 进行了不同的调用 我已经按照苹果文档 https dev
  • 无法在应用程序中使用表情符号:拒绝提交到AppStore

    有谁知道是否所有表情符号都是苹果公司的财产 我试图在我的应用程序中使用其中的很多 大约 80 个 作为文本 但应用程序被拒绝 我问是否有一个我不能使用的表情符号列表 但没有得到答案 如果你已经被 AppStore 提交过程拒绝 你就会知道它
  • 如何优化画布上的动画? HTML 5

    我面临着一个问题 随着各种图片向左 向右 向上和向下移动 画布上的动画速度会减慢 我需要有关如何优化动画的建议 重要的是动画适用于所有主要浏览器 特别是 Chrome Firefox 和 Internet Explorer 动画可以优化吗
  • 如果存在依赖,编译器能否正确处理静态变量的初始化顺序?

    如果存在依赖 编译器能否正确处理静态变量的初始化顺序 例如 我有 a h struct A static double a a cpp include a h double A a 1 b h struct B static double
  • 从 DocumentDb 中删除特定文档

    以下代码检索具有特定 jobId 的所有 CrawlResult 文档 var result from c in documentDb CreateDocumentQuery
  • 特定域的 htaccess 标头?

    我有三个环境 env com env uat com env pre com 所有三个页面都运行相同的代码 我希望 env uat com 和 env pre com 都在 htaccess 中获取此内容 Header set X Robo
  • 角度隐藏忽略

    我试图在 Angular2 中使用隐藏属性 当我包含改变 DIV 显示的样式时 隐藏属性将被忽略 当运行下面的代码时 两个 div 都会显示 当我删除 displayInline 类时 第一个 DIV 被隐藏 第二个 DIV 被显示 如预期
  • TF400324:在 Visual Studio 2012 中,Team Foundation 服务无法从服务器 获得

    当我在 Visual Studio 2012 Professional 中打开现有解决方案时 出现上述错误 这曾经有效 但在重建计算机后出现了一些问题 我已经安装了 Visual Studio 2015 Community 并且可以连接到相
  • 使用反向 Y 轴计算 2 点之间的度数

    我正在使用 javascript canvas 创建一个简单的 2D 游戏 我需要计算出某个物体相对于我的位置的角度 所以 假设我在 10 10 并且物体在 10 5 这将导致 90 度 因为正 Y 向下 负 Y 向上 10 10 与 10
  • 在 PHP 中加密,在 C# (WP7 / Silverlight) 中使用 AES / Rijndael 解密

    我在我的 Android 应用程序中使用了用 PHP 编写的 REST 服务 没有遇到太多麻烦 现在我尝试在 Windows Phone 应用程序中使用它 我已经快疯了 到目前为止我所知道的 Silverlight 将仅接受 CBC 模式下
  • 用于将请求参数映射到对象的 Java 库

    我过去在一个项目中使用过 stipes 它有一个很棒的 TypeConverter 库 可以获取请求参数并将它们路由到 JavaBeans 中 它甚至可以处理映射和数组 例如 class A private int num private
  • 为什么我们应该复制块而不是保留?

    我最近在使用 Facebook 的应用程序切换块时遇到了一个问题 我需要在 Facebook 登录后调用一个块 首先 当应用程序切换回来时 我的块被破坏了 因为它在堆栈上 所以我决定保留它 但这没有用 我把这个问题搞砸了 我找到了一个解决方
  • vueJS + webpack:导入字体、CSS 和 node_modules

    我从 Vue js 和 Webpack 开始 对如何正确导入和引用我的字体 CSS 和node modules正确 我开始使用我的应用程序vue cli 这是最终的结构 build config node modules src asset
  • 使用 Geb 维护测试之间的会话

    我正在使用 Geb 测试我的应用程序 并且我想在测试之间保持会话 这样我就可以避免登录每个测试 在浏览器中观看测试时这很烦人 有没有办法保持会话 默认情况下 Geb 测试集成会在每次测试后清除所有 cookie 这意味着您会丢失 Web 会
  • Python如何在使用Python写入新值后保持XML注释存在?

    我有一个 XML 文件 然后需要更新一些值 我的 XML 文件包含注释 我想在编写 XML 后保留注释 但它消失了 这是我的 XML
  • 如何将静态字符串与 XML 字符串资源连接起来?

    我正在尝试将静态 硬编码 字符串与引用的字符串结合起来strings xml对于字符串数组项 目标是拥有一个动态指标列表 其中所有语言的数字都相同 但指标文本值可能会因语言而变化 如下所示
  • 我应该将 Eclipse 插件片段的测试代码放在哪里?

    我在搜索 Eclipse 插件测试代码放置位置的最佳实践时发现了几篇文章 他们中的大多数人建议像这样的片段this http rcpquickstart wordpress com 2007 06 20 unit testing plug
  • 如何在 MySQL LIKE 子句中使用用户变量?

    我正在尝试设置一些简单的 SQL 脚本来帮助进行一些短期数据库管理 因此 我正在设置变量以尝试更轻松地重用这些脚本 我遇到的问题具体与 LIKE 子句有关 SET email email protected cdn cgi l email
  • Ruby 是否使用 $stdout 来写入 put 和 return 的输出?

    我想知道 Ruby 使用输出流在命令行打印这些内容 irb main 001 0 gt a test gt test irb main 002 0 gt puts a test gt nil irb main 003 0 gt a gt t