Ruby中的一行程序,用于显示提示、获取输入和分配变量?

Ruby中的一行程序,用于显示提示、获取输入和分配变量?,ruby,input,Ruby,Input,我经常发现自己在做以下事情: print "Input text: " input = gets.strip 有没有一种优雅的方式可以做到这一点?比如: puts "Input text: #{input = gets.strip}" 问题是它在显示提示之前等待输入。有什么想法吗?请查看: 您提出的解决方案的问题是,在读取、剥离和分配输入之前,无法生成要打印的字符串。您可以用分号分隔每一行: $ ruby -e 'print "Input text: "; input=gets.strip;

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

print "Input text: "
input = gets.strip
有没有一种优雅的方式可以做到这一点?比如:

puts "Input text: #{input = gets.strip}"
问题是它在显示提示之前等待输入。有什么想法吗?

请查看:


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

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

我认为按照Marc Andre的建议去做将是一个不错的选择,但是当你可以在你将要使用的脚本顶部定义一个两行函数时,为什么还要引入一大堆代码呢

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

name = prompt "Input name: "

一班机当然可以。优雅…不完全是

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

跟随@Bryn的领导:

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

我知道这个问题很老,但我想我应该展示一下我用什么作为获取输入的标准方法

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标准库的一部分,因此您无需安装任何gems。此外,使用
获取时不能移动光标,但可以使用
读取行

而且,我知道这个方法不是一行,但是当你调用它的时候

name = input "What is your name? "
我偶然发现了gem,我真的很喜欢它,我发现它比Highline更简洁,更易于使用,尽管它本身缺乏输入验证。
你的例子可以这样写

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

这其实不是一条线;您使用的是分号,这可能不符合他的请求的优雅部分。$ruby-e'print(“输入文本:”)| |(Input=gets.strip)&&&(puts-Input)”使其成为接受提示文本并返回输入文本的函数?如果你想变得更有趣并且需要多个提示/输入循环,你可以让函数接受一系列提示和一个块,然后循环提示并产生每个输入。事实上,这也可以很好地工作。直到您想要添加一些输入检查。或者一些默认值。或者不显示键入的内容,因为您需要密码…对于5秒钟的脚本,我会说这是正确的方法。我会在
获取
后附加
.chomp
方法,否则变量将在末尾包含一个
\n
换行符。“注意:]终止ruby解释器,在等待输入行时用户按下“^C”后不会返回终端状态。”我喜欢这一点和@Andrew Grimm的建议,认为这是使用
highline/import
签出
input=(打印“Name:”;gets.rstrip)的最佳选择
更具可读性。但这两种解决方案在
nil
值方面都存在问题。在Ruby 2.3中,可以使用
input=(打印'Name:';获取和.rstrip)优雅地处理它们。
require 'inquirer'
inputs = Ask.input 'Input text'