我经常发现自己在做以下事情:
print "Input text: "
input = gets.strip
有没有一种优雅的方法可以在一行中完成此操作?比如:
puts "Input text: #{input = gets.strip}"
这样做的问题是它会等待输入然后显示提示。有什么想法吗?
我认为采用 Marc-Andre 建议的方法将是可行的方法,但是当您可以在您要执行的任何脚本的顶部定义一个两行函数时,为什么要引入大量代码用途:
def prompt(*args)
print(*args)
gets
end
name = prompt "Input name: "
查看高线:
require "highline/import"
input = ask "Input text: "
肯定有一个班轮黑客。优雅...但不完全是。
input = [(print 'Name: '), gets.rstrip][1]
我知道这个问题已经很老了,但我想我会展示我使用的标准方法来获取输入。
require 'readline'
def input(prompt="", newline=false)
prompt += "\n" if newline
Readline.readline(prompt, true).squeeze(" ").strip
end
这真的很好,因为如果用户在末尾或开头添加奇怪的空格,它会删除这些空格,并保留他们过去输入的内容的历史记录(将
true
更改为 false
)让它这样做。)。并且,如果 ARGV
不为空,则 gets
将尝试从 ARGV
中的文件读取,而不是获取输入。另外,Readline
是 Ruby 标准库的一部分,因此您无需安装任何 gem。另外,使用 gets
时无法移动光标,但使用 Readline
时可以。
而且,我知道这个方法不是一行,而是当你调用它时
name = input "What is your name? "
跟随@Bryn的带领:
def prompt(default, *args)
print(*args)
result = gets.strip
return result.empty? ? default : result
end
您提出的解决方案的问题是,在读取、剥离和分配输入之前,无法构建要打印的字符串。 您可以用分号分隔每一行:
$ ruby -e 'print "Input text: "; input=gets.strip; puts input'
Input text: foo
foo
我偶然发现了 Inquirer gem,我真的很喜欢它,我发现它比 Highline 更简洁、更容易使用,尽管它本身缺乏输入验证。
你的例子可以这样写
require 'inquirer'
inputs = Ask.input 'Input text'
如何编写用户给变量的提示?