【问题标题】:Ruby 'gets' that works over multiple linesRuby 'gets' 适用于多行
【发布时间】:2012-11-30 04:01:42
【问题描述】:

使用 IRB,我想输入一个多行字符串,以便从中删除某些字符。 “获取”只允许单行 - 多行是否有类似的功能。

ASCII_project.rb(main):002:0* puts = "What's the text you want to strip?"
=> "What's the text you want to strip?"
ASCII_project.rb(main):003:0> str = gets

我现在想粘贴一段文本 - 因为新行它不起作用。这就是为什么我要收集多行

这里是代码

# encoding: CP850
puts = "What's the text you want to strip?"
str = gets
str.gsub!(/\P{ASCII}/, '')
puts str

【问题讨论】:

  • 哼,只是callget了几次?
  • 如果不是换行符,该方法应该如何知道何时停止阅读?

标签: ruby gets


【解决方案1】:

你可以使用这个方法,它接受文本直到第一个空行

def multi_gets all_text=""
  while (text = gets) != "\n"
    all_text << text
  end
  all_text
end

或者这个,你可以用你定义的任何结束字符替换\n\n

def multi_gets all_text=""
  while all_text << STDIN.gets
    return all_text if all_text["\n\n"]
  end
end

【讨论】:

  • 这是对终止符进程的很好的封装。
【解决方案2】:

你可以通过以下方式做到这一点,

$/ = "END"  
user_input = STDIN.gets
puts user_input

当您认为输入完成时,请务必输入 END 关键字,

这也只适用于实际的解释器而不是 irb。

【讨论】:

  • 这是 Ruby 中唯一可行的解​​决方案
  • 你能解释一下 $/ 的作用吗?
  • @Joseph 这是一个 ruby​​ 全局变量,被gets和readline用作分隔符。
【解决方案3】:

你可以像这样在$stdin上使用readlines()

> $stdin.readlines
Mit Wohnungen, mit Bergen, Hügeln, Flüssen,
Solang ichs deutlich sah, ein Schatz der Freuden;
Zuletzt im Blauen blieb ein Augenweiden
An fernentwichnen lichten Finsternissen.

# ^D
 => ["Mit Wohnungen, mit Bergen, Hügeln, Flüssen,\n",
 "Solang ichs deutlich sah, ein Schatz der Freuden;\n",
 "Zuletzt im Blauen blieb ein Augenweiden\n",
 "An fernentwichnen lichten Finsternissen.\n"]

【讨论】:

  • 您的示例代码使用了错误的标准变量名称。我会编辑它,但它在 6 个字符的限制下
  • @Will 谢谢,没有引起注意。
【解决方案4】:
str = <<-EOF
Your multi line
text goes here
.....
EOF

但问题是你必须以 EOF 结尾

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多