You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中无需正则从STDIN提取多行注释的实现方法

嘿,我来帮你解决这两个问题!


提取=begin/=end注释内容的正确实现

你的初始代码有几个小问题,比如状态变量incomments被放在循环里每次重置,导致无法持续跟踪是否处于注释块;另外还错误打印了=end那行。这里给你一个不用正则的正确实现:

starting = "=begin"
ending = "=end"
in_comments = false

ARGF.each do |line|
  # 进入注释块的情况:行里有=begin但没有=end
  if line.include?(starting) && !line.include?(ending)
    in_comments = true
    next # 跳过=begin所在行
  end

  # 退出注释块的情况:行里有=end但没有=begin
  if line.include?(ending) && !line.include?(starting)
    in_comments = false
    next # 跳过=end所在行
  end

  # 如果处于注释块内,打印当前行(可按需去除左侧空格)
  puts line.lstrip if in_comments
end

逻辑说明:

  • 把in_comments状态变量放在循环外部,确保它能在整个遍历过程中保持状态,不会每次循环都被重置
  • 遇到=begin行时,激活注释状态并跳过该行(我们不需要输出开头标记)
  • 遇到=end行时,关闭注释状态并跳过该行(同样不需要输出结尾标记)
  • 只有处于注释状态时,才打印当前行的内容,用lstrip可以去掉行首的空格,让输出更整洁

用你提供的测试输入运行这段代码,就能得到你想要的注释中间内容啦。


关于ARGF的性能疑问

ARGF并不会因为“等待所有输入”产生额外的性能开销。它的工作机制是逐行读取输入——不管输入来自单个文件、多个文件还是标准输入,它都是读一行处理一行,不会把所有内容先加载到内存里。

实际使用中,ARGF的性能和直接读取单个文件/STDIN几乎没有差异,主要的性能消耗都是来自IO操作本身。除非你处理的是超大规模的输入,这种情况下不管用什么方式读取,IO都会是瓶颈,ARGF本身不会带来额外的负担。它的设计初衷就是方便处理多输入源,不用特意担心性能问题。


内容的提问来源于stack exchange,提问作者jeancode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:30:56