如何在Ruby中使用"gets"和"gets.chomp"

52

我了解到gets创建一个新行并要求用户输入一些内容,而gets.chomp也是这样做的,只是它不会创建一个新行。 gets必须返回一个对象,所以你可以在它上面调用方法,对吗?如果是这样的话,让我们把gets返回的对象命名为tmp,然后您可以调用tmpchomp方法。 但是,在gets返回tmp之前,它应该在屏幕上打印一个新行。那么chomp是做什么的呢?它删除gets创建的新行吗?

另一种重新说明我的问题的方法是:当我调用gets.chomp时,执行以下操作:

  1. gets打印一个新行
  2. gets返回tmp
  3. tmp.chomp删除新行
  4. 用户输入

这是正确的顺序吗?


3
"gets"命令不会自动换行,需要用户手动输入。"gets"只是将用户输入的文本传递给程序。 - sawa
6个回答

80

gets函数允许用户输入一行文本并将其作为值返回给程序。该值包含行末换行符。如果您在该值上调用chomp函数,则会去除该行末换行符。因此,不,您所说的不正确,应该是:

  1. gets 获取一行文本,包括末尾的换行符。
    • 这个就是用户输入的内容。
  2. gets将该行文本作为字符串值返回。
  3. 在该值上调用chomp函数将去除该行末换行符。

您在屏幕上看到文本的事实只是因为首先在那里输入了它。 gets不能神奇地抑制您输入的内容输出。


21

问题不应该是“这是正确的顺序吗?”而应该是“这种方法是否正确?

考虑以下,这更或多或少是您要实现的内容:

  1. 将一个名为tmp的变量赋值为gets的返回值,该返回值是一个字符串。
  2. 然后,在该对象上调用String的chomp方法,您可以看到chomp已删除尾随的换行符。

    实际上,chomp所做的是删除您字符串末尾的Enter字符(“\n”)。当您逐个输入h e l l o字母并按下Enter键时,gets将获取所有字母和Enter键的新行字符(“\n”)。

1. tmp = gets
hello
=>"hello\n"

2. tmp.chomp
"hello"

gets 是你的用户输入。另外,知道 *gets 的意思是“获取字符串”,puts 的意思是“输出字符串”也是很好的。这意味着这些方法仅处理字符串。


3

chomp 是一种用于去除字符串末尾的换行符"\n"的方法。

当使用"gets"从用户处获取输入时,它会在字符串末尾添加一个换行符"\n"。因此,要从字符串中删除"\n",需要使用"chomp"。

例如:

str = "Hello ruby\n"

str = str.chomp

puts str

输出结果为:

"Hello ruby"


1
澄清一下:chomp 只会移除一个结尾的换行符。如果有多个结尾的换行符,你必须要循环移除直到没有为止,或者使用其他方法去除它们。换行符并不是由 gets 添加的,而是键盘驱动程序在按下该键后返回的 Enter 字符。gets 只会返回它所接收到的内容,并在看到 "\n" 后将控制权返回给代码。 - the Tin Man

3

chomp函数会删除字符串末尾的指定分隔符(如果存在),并返回新的字符串。

更多信息请参考Ruby String API


1
  • "gets" 允许用户输入,但会在字符串后添加一个新行(字符串指文本或字符序列)

    "gets.chomp" 也允许用户输入,就像 "gets" 一样,但是在字符串后不会添加新行。

它们之间的差异证明:

Gets.chomp

puts "Enter first text:"
text1 = gets.chomp
puts "Enter second text:"
text2 = gets.chomp
puts text1 + text2

获取:

puts "Enter first text:"
text1 = gets
puts "Enter second text:"
text2 = gets
puts text1 + text2

复制粘贴我给你的代码,运行后你会发现并知道它们是不同的。

0

例如:

x = gets
y = gets
puts x+y

并且

x = gets.chomp
y = gets.chomp
puts x+y

现在分别运行这两个示例,看看它们之间的不同。

2
你试图指出的,用户已经知道了。问题在于澄清事情。 - Ziyan Junaideen
如果有人不知道这个是干什么的,请在IRB或Pry中运行示例,那将会更加明显。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接