【问题标题】:Why does Ruby's 'gets' includes the closing newline?为什么 Ruby 的“获取”包含结束换行符?
【发布时间】:2011-06-21 21:58:44
【问题描述】:

我从不需要从gets 得到的结尾换行符。有一半的时间我忘记了chomp 它,这是一种痛苦....

为什么会出现?

【问题讨论】:

  • 木工谚语:你总是可以从木板上砍下更多的木头,但你不能把它放回去。
  • @DGM 您可以随时添加“\n”。
  • @sawa:如果你确定有一个开始。
  • @Andrew 唯一没有得到的情况是到达 EOF 时。但这有关系吗?
  • gets 是许多语言中的标准方法,一直植根于 C。它的行为与 C 相同,这可能是为了保持一致性。我怀疑它会改变,所以您可能想要习惯自动添加chomp,或者更加注意您需要的数据类型并仅在必要时添加chomp。这只是我们学习做的编程杂务之一。

标签: ruby newline language-design


【解决方案1】:

就像puts(听起来很相似)一样,它被设计用于处理线条,使用\n 字符。

gets 接受一个可选参数,用于“拆分”输入(或“只读取直到它到达)。它默认为特殊的全局变量$/,默认情况下包含\n

gets 是一种非常通用的读取流的方法,并包含此分隔符。如果它不这样做,部分流内容将会丢失。

【讨论】:

    【解决方案2】:
    var = gets.chomp 
    

    这会将所有内容放在一条线上。

    【讨论】:

    • 这个答案根本没有解决这个问题。我想知道为什么它得到了如此多的支持。
    【解决方案3】:

    如果您查看IO#gets 的文档,您会注意到该方法采用可选参数sep,默认为$/(输入记录分隔符)。您可以决定将输入拆分为换行符以外的其他内容,例如段落(“零长度分隔符一次读取一个段落(输入单独段落中的两个连续换行符)”):

    >> gets('')
    dsfasdf
    fasfds
    
    
    dsafadsf    #=> "dsfasdf\nfasfds\n\n"
    

    【讨论】:

    • 不过,这引出了为什么它应该捕获并返回分隔符的问题——"1,2,3".split(',') 不返回逗号。我会争辩(正如我在回答中所做的那样)差异的原因是,将逗号从split 的结果中去掉并不是额外的“工作”,但gets 必须先缓冲记录分隔符它可以注意到它的出现。
    • 为什么要去掉分隔符? IO#gets 也用于其他情况,在某些情况下,剥离分隔符可能不像直接要求用户输入那样自然。
    【解决方案4】:

    从性能的角度来看,更好的问题是“我为什么要摆脱它?”。这不是一个 成本,但在幕后你必须付出代价来咀嚼返回的字符串。虽然您可能从来没有遇到过您需要它的案例,但您肯定有很多您不关心的案例——gets s; puts stuff() if s =~ /y/i 等。在这些案例中,您会看到通过不咀嚼来提高(微小的)性能。

    【讨论】:

    • 我不这么认为。 Ruby 并非设计为一门快速的语言,如果每个人都必须无论如何都要 chomp 字符串,那是没有好处的。
    • 仅仅因为 Ruby 极具表现力并不意味着您不能考虑速度。就像我说的,“没有人需要换行符”!=“每个人都必须咀嚼”。
    猜你喜欢
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多