Ruby 中的一个衬垫用于显示提示、获取输入和分配给变量?

问题描述 投票:0回答:8

我经常发现自己在做以下事情:

print "Input text: "
input = gets.strip

有没有一种优雅的方法可以在一行中完成此操作?比如:

puts "Input text: #{input = gets.strip}"

这样做的问题是它会等待输入然后显示提示。有什么想法吗?

ruby input
8个回答
79
投票

我认为采用 Marc-Andre 建议的方法将是可行的方法,但是当您可以在您要执行的任何脚本的顶部定义一个两行函数时,为什么要引入大量代码用途:

def prompt(*args)
    print(*args)
    gets
end

name = prompt "Input name: "

77
投票

查看高线

require "highline/import"
input = ask "Input text: "

35
投票

肯定有一个班轮黑客。优雅...但不完全是。

input = [(print 'Name: '), gets.rstrip][1]

15
投票

我知道这个问题已经很老了,但我想我会展示我使用的标准方法来获取输入。

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? "

12
投票

跟随@Bryn的带领:

def prompt(default, *args)
  print(*args)
  result = gets.strip
  return result.empty? ? default : result
end

4
投票

您提出的解决方案的问题是,在读取、剥离和分配输入之前,无法构建要打印的字符串。 您可以用分号分隔每一行:

$ ruby -e 'print "Input text: "; input=gets.strip; puts input'
Input text: foo
foo

2
投票

我偶然发现了 Inquirer gem,我真的很喜欢它,我发现它比 Highline 更简洁、更容易使用,尽管它本身缺乏输入验证。
你的例子可以这样写

require 'inquirer'
inputs = Ask.input 'Input text'

-1
投票

如何编写用户给变量的提示?

© www.soinside.com 2019 - 2024. All rights reserved.