为什么Ruby';s';获取';包括结束新行吗?

为什么Ruby';s';获取';包括结束新行吗?,ruby,newline,language-design,Ruby,Newline,Language Design,我从不需要从get获取的结束换行符。有一半时间我忘了咀嚼它,这是一种痛苦 为什么会有它?从性能的角度来看,更好的问题是“我为什么要摆脱它?”。这不是一个大的成本,但在引擎盖下你必须支付咀嚼被归还的绳子。虽然你可能从来没有过需要它的案例,但你肯定有很多案例你不在乎--gets;puts stuff()如果s=~/y/i,等等。在这些情况下,您会看到(微小的,微小的)性能改进,因为不吃东西。与puts(听起来很相似),它被设计为使用\n字符处理行 gets接受一个可选参数,该参数用于“拆分”输入(或

我从不需要从
get
获取的结束换行符。有一半时间我忘了咀嚼它,这是一种痛苦


为什么会有它?

从性能的角度来看,更好的问题是“我为什么要摆脱它?”。这不是一个大的成本,但在引擎盖下你必须支付咀嚼被归还的绳子。虽然你可能从来没有过需要它的案例,但你肯定有很多案例你不在乎--
gets;puts stuff()如果s=~/y/i
,等等。在这些情况下,您会看到(微小的,微小的)性能改进,因为不吃东西。

puts
(听起来很相似),它被设计为使用
\n
字符处理行

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


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

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


这一切都在你身上。

我不认为是这样。露比不是被设计成一种快速的语言,如果每个人都不得不把绳子弄得一团糟,那就没有什么好处了。仅仅因为Ruby非常有表现力,并不意味着你不能考虑速度。就像我说的,“没有人需要换行”。“。不过,这就引出了一个问题,为什么它应该捕获并返回分隔符--
“1,2,3”。split(“,”)
不返回逗号。我认为(正如我在回答中所做的那样)产生差异的原因是它没有额外的“工作”要在
split
的结果中保留逗号,但是
gets
必须先缓冲记录分隔符,然后才能注意到它出现了。为什么要去除分隔符?
IO#gets
也用于其他上下文,在某些上下文中,去除分隔符可能不像直接请求用户输入时那样自然put.woodworking说:你总是可以从一块木板上砍更多的木头,但你不能把它放回去。@DGM你总是可以加上“\n”@sawa:如果你确定有一个可以开始的话。@Andrew你没有得到一个的唯一情况是当你达到EOF时。但是这有关系吗?
gets
是许多语言中的标准方法,可以追溯到C。它的行为与C相同,这可能是为了一致性。我怀疑它会改变,所以你可能会改变想要习惯于自动添加
chomp
,或者更多地关注您需要的数据类型,并且只在必要时添加
chomp
。这只是编程中我们学习做的那些琐事之一。这个答案根本没有解决这个问题。我想知道为什么它会得到如此多的提升。
>> gets('')
dsfasdf
fasfds


dsafadsf    #=> "dsfasdf\nfasfds\n\n"
var = gets.chomp