在 Ruby 中处理 ARGV,无需 if...else 块

2024-02-13

在一篇关于无条件编程 http://michaelfeathers.typepad.com/michael_feathers_blog/2013/11/unconditional-programming.html迈克尔·费瑟斯 (Michael Feathers) 展示了如何限制if语句可以用作降低代码复杂性的工具。

他用一个具体的例子来说明他的观点。现在,我一直在考虑其他可以帮助我更多地了解无条件/的具体示例ifless/for更少的编程。

例如在这个cat https://en.wikipedia.org/wiki/Cat_(Unix)克隆有一个if..else block:

#!/usr/bin/env ruby

if ARGV.length > 0
  ARGV.each do |f|
    puts File.read(f)
  end
else
  puts STDIN.read
end

事实证明红宝石有ARGF这使得这个程序变得更加简单:

#!/usr/bin/env ruby

puts ARGF.read

我想知道是否ARGF不存在如何重构上面的例子所以不存在if..else block?

还对其他说明性具体示例的链接感兴趣。


从技术上讲你可以,

inputs = { ARGV => ARGV.map { |f| File.open(f) }, [] => [STDIN] }[ARGV]
inputs.map(&:read).map(&method(:puts))

虽然那是代码高尔夫 https://codegolf.stackexchange.com/而且太聪明了。

不过,它是如何运作的呢?

  • 它使用哈希来存储两个替代方案。
  • Map ARGV到打开文件的数组
  • Map []到一个数组STDIN,有效地覆盖ARGV如果为空则输入
  • Access ARGV在哈希中,返回[STDIN]如果它是空的
  • 读取所有打开的输入并打印它们

不过,不要编写该代码。

正如中提到的我对你另一个问题的回答 https://stackoverflow.com/questions/41335425,无条件编程并不是要避免if不惜一切代价表达,但努力获得可读且能揭示意图的代码。有时这仅仅意味着使用if表达。

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

在 Ruby 中处理 ARGV,无需 if...else 块 的相关文章

  • C# 堆和堆栈上常规类静态类静态方法实例方法和数据成员的内存分配? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 本书的大部分内容从未讨论程序如何执行
  • 在 Rails 中呈现路由错误的 404 页面

    我试图在 Rails 中渲染集成的 404 页面作为例外 我尝试了这个 但仍然收到路由错误页面 posts controller rb def destroy if current user username post email post
  • 将“Authorization Bearer”哈希添加到 Net::HTTP post 请求 (Ruby)

    我怎样才能添加Authorization Bearer到 POST 请求Net HTTP 我只能在文档中找到 基本身份验证 的帮助 req basic auth user pass Source https docs ruby lang o
  • Ruby on Rails 离线编程

    我将离开互联网几周 但仍然想完成一个项目 我应该采取哪些步骤来确保在断开连接时能够访问我需要的内容 ruby 和 ROR 离线时 以下内容很难获得 gems docs Rails 专家博客 堆栈溢出 so gem 安装尽可能多 下载所有的轨
  • GIT 和 Ruby:如何从 ruby​​ 脚本内部取消设置 GIT_DIR 变量?

    我编写了一个非常简单的 部署 脚本作为我的post update挂钩到我的裸 git 存储库中 变量如下 live domain mydomain com staging domain stage mydomain com git repo
  • tkinter - 使用按钮在帧之间来回切换

    我需要功能 最好是一个功能 当按下下一页和后退按钮时可以在页面之间来回切换 我想这可以通过将布尔变量分配给后退和下一页按钮来完成 不确定是否可以这样做 来确定您是否要前进或后退所有页面的有序列表 需要知道当前升高的框架的索引 索引可用于找出
  • 有没有办法避免自动更新 Rails 时间戳字段?

    如果您有数据库列created at and updated at当您创建和更新模型对象时 Rails 将自动设置这些值 有没有办法在不接触这些列的情况下保存模型 我正在引入一些旧数据 我想根据 不同名称的 旧数据字段中的相应值设置这些值
  • ruby中如何将binary32转换为float

    我有一个以 IEEE 32 编码的 binary32 如何将 0x0040EDC2 转换为 118 625 我尝试了几种打包和解包选项 但没有成功 IEEE http en wikipedia org wiki Single precisi
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 自动加载常量时检测到循环依赖

    我将 Rails 从版本 3 1 2 运行良好 升级到 4 0 并遇到以下错误 circular dependency detected while autoloading constant Foo 我创建了一个类ProductFactor
  • 我应该如何使用 alias_method_chain 作为构建方法?

    我正在使用 Ruby on Rails 3 2 13 我想正确使用alias method chain build option name声明 因为我收到一个奇怪的错误 那是 在我的控制器文件中我有 class Articles Comme
  • Cucumber / Savon 省略或删除日志输出

    在运行黄瓜测试时 我得到 除了测试结果之外 许多与调试 日志相关的输出 格式如下 D 2013 03 06T12 21 38 911829 49031 DEBUG SOAP request D 2013 03 06T12 21 38 911
  • 查找 Rails 应用程序中未使用的代码

    如何查找正在运行和未运行的代码生产中 该应用程序经过充分测试 但还有很多测试unused代码 因此 他们在运行测试时得到覆盖 我想重构并清理这个烂摊子 它一直在浪费我的时间 我有很多后台工作 这就是为什么我希望生产环境来指导我 在 Hero
  • Rails 3.2 防止使用错误保存对象

    我有一个 ActiveRecord 对象 我想阻止它被保存 而不对模型进行永久验证 你曾经可以使用做这样的事情errors add但它看起来不再有效了 user User last user errors add name name doe
  • 在 PHP 应用程序中实现插件的设计模式

    对于如何在 PHP 应用程序中实现插件有共识吗 我已经调查过观察者模式 http devzone zend com 1732 implementing the observer pattern with splobserver and sp
  • 加载“mysql2”Active Record 适配器时出错

    我正在尝试升级我的应用程序 这是我在部署应用程序时遇到的错误 加载 mysql2 Active Record 适配器时出错 缺少它所依赖的宝石 无法激活mysql2 0 4 4 已经激活mysql2 0 3 21 确保所有依赖项都添加到 G
  • 将扁平树解析为非扁平树的算法

    我有以下扁平树 id name parent id is directory 50 app 0 1 31 controllers 50 1 11 application controller rb 31 0 46 models 50 1 1
  • 具有委托和条件的 Active Record

    是否可以在 Active Record 模型中使用委托并使用诸如 if on it class User lt ApplicationRecord delegate company to gt master if gt has master
  • 使用 Carrierwave 上传到 S3 时获取 mp3 持续时间

    我正在编写一个应用程序 它基本上是一个音乐平台 我想通过其元数据获取 mp3 的持续时间 并将其保存在表中 然后再将其上传到 S3 我使用载波和雾宝石的组合来上传 提取 mp3 元数据以保存到数据库的推荐方法是什么 有一个用于此类操作的 g
  • 你怎么知道何时使用设计模式? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 任何人都可以阅读 GoF 书来了解什么是设计模式以及如何使用它们 但是弄清楚设计模式何时解决问题的过程是什么 模式的知识是否驱动设计

随机推荐

  • python中的嵌套正则表达式

    在 Perl 中我可以这样做 number qr zero one two three four five six seven eight nine ix foo qr quantity s number ix 我的实际正则表达式有很多行
  • 如何在浏览器中调试angularjs的$rootScope对象

    当 AngularJS 应用程序加载到浏览器中时 有没有办法对其进行调试 IE 我希望得到 rootScope我当前的应用程序 我该怎么做呢 巴塔朗 1 另外 您可以通过从控制台执行以下命令来获取 DOM 中任何元素的范围 angular
  • 根据列表框尺寸调整列表框内容的大小

    我正在尝试根据列表框本身调整列表框内容的大小 这是在 WPF 中完成的 关于这如何可能的任何想法 我认为当您说 调整大小 时 您的意思是您想要在两个方向上拉伸项目 要采用默认的列表框并水平拉伸项目 您需要做的是
  • C++ 求两个向量之间的差异

    假设你有 2 个向量 vector
  • 如何在 Eclipse 中找到可重写的方法

    public class test2 extends ListActivity 例如 我想找到 ListActivity 中可以重写的方法是什么 在 eclipse 中找到这个的快捷键是什么 如何通过 eclipse intellisens
  • 如何将 fancybox 绑定到动态添加的元素?

    我使用 jquery fancybox 1 3 4 作为弹出表单 但我发现 fancybox 无法绑定到动态添加的元素 例如 当我向当前文档添加 html 元素时 像这样 首先我使用 jquery 将一个元素附加到主体 document b
  • Jackson - 将内部对象列表反序列化为更高级别的列表

    使用 Spring Boot 和 Jackson 如何将包装 内部列表直接反序列化为外层列表 例如 我有 transaction items item itemNumber 193487654 itemDescription Widget
  • 从 JavaScript 手动触发 iPhone/iPad/iPod 键盘

    我正在开发一个 HTML 代码编辑器 使用简单的 DIV 并捕获事件 当我在 iPad 上使用它时 键盘永远不会弹出 因为从技术上讲我并不处于可编辑字段中 有没有办法以编程方式告诉 iPad 我需要键盘 如果您的代码是通过用户操作启动的某些
  • 将 pop() 与 JavaScript 关联数组结合使用

    我怎样才能在JS中做类似下面的事情 我想模仿 pop 在对象而不是数组上 var deck cardK 13 cardQ 12 cardAJ 11 var val deck pop console log Key val key conso
  • Python 代码块的正则表达式?

    如何创建一个可以匹配行开头以及以 tab 开头的所有以下行的正则表达式 例如 not keyword not this line keyword and random text this line this line and this li
  • 从 CSV 文件创建 ODS 工作表

    我有一组 CSV 文件 需要将其转换为具有多个选项卡式工作表的单个 ODS 甚至 Excel 电子表格 目前我正在使用 python 的 pyexcel 库 但它有很多错误并且速度非常慢 Libreoffice 有一个很好的文件转换实用程序
  • Android:从 Hashmap Arraylist 获取单个值?

    基本上 我有一个使用哈希映射的数据库 运行查询后 我想输出 ID 并将其存储在另一个活动的数组中 之后 我想访问数组中的单个元素 这是我的数据库代码 public ArrayList
  • test_that 与 match.fun 在使用两层深度时会引发意外错误

    我使用时遇到问题match fun和 一起test that when match fun用于嵌套函数内部 为了说明这一点 我构建了一个包含两个函数的快速玩具示例 R 包 后者简单地调用前者 i dont throw error lt fu
  • 当成员也是分层结构时,如何构建类结构?

    我正在构建一个 PHP Web 应用程序 它应该为用户提供订购他与另一个人 组织之间的 ConnectDirect 或文件传输网关 连接的 安装 设置的可能性 连接实现的技术细节并不重要 在应用程序中 它只涉及作为产品的连接 可以订购和管理
  • 手机重启后小部件不显示

    我创建了一个小部件 它工作得很好 直到我重新启动手机 然后小部件不会显示它是不可见的 但如果我按住并单击我可以将它扔进垃圾箱 我有一个从 widgetprovider 中的配置活动调用的函数 它执行以下操作 static void upda
  • 如何通过子进程模块调用 ssh 以便它使用 SSH_ASKPASS 变量

    我正在编写一个使用 SSH 命令的 GUI 我尝试使用 subprocess 模块调用 ssh 并设置 SSH ASKPASS 环境变量 以便我的应用程序可以弹出一个窗口要求输入 SSH 密码 但是 我无法使用给定的 SSH ASKPASS
  • 如何从单个输入获取多个文件输入

    使用 Firefox 和 Chrome 浏览器 我有一个输入文件元素
  • Ruby on Rails - 数组哈希、按列名分组和求和

    我有以下哈希数组 idx gt 1234 账户 gt abde 钱 gt 4 00 order gt 00001 idx gt 1235 account gt abde money gt 2 00 order gt 00001 idx gt
  • 执行程序时的Fortran77参数

    我目前正在做 Fortran77 作业 所以请不要告诉我确切的编码 但请给我一些我想要做什么的提示 使用UNIX终端 我想通过执行来获取传递的参数 program exe parameter 在标准 Fortran77 中你不能 故事结局
  • 在 Ruby 中处理 ARGV,无需 if...else 块

    在一篇关于无条件编程 http michaelfeathers typepad com michael feathers blog 2013 11 unconditional programming html迈克尔 费瑟斯 Michael