Ruby中的一个内核用于显示提示,获取输入和分配给变量?

Jar*_*sen 77 ruby input

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

print "Input text: "
input = gets.strip
Run Code Online (Sandbox Code Playgroud)

有一种优雅的方式在一行中做到这一点吗?就像是:

puts "Input text: #{input = gets.strip}"
Run Code Online (Sandbox Code Playgroud)

这样做的问题是它在显示提示之前等待输入.有任何想法吗?

Mar*_*une 77

查看高线:

require "highline/import"
input = ask "Input text: "
Run Code Online (Sandbox Code Playgroud)


小智 73

我认为像Marc-Andre所建议的那样将会是一种方式,但是当你可以在你要使用的任何脚本的顶部定义一个双线函数时,为什么要引入大量的代码:

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

name = prompt "Input name: "
Run Code Online (Sandbox Code Playgroud)

  • 对于一个5秒钟的剧本,我会说这是要走的路. (4认同)
  • 实际上,这也会很好.直到你想添加一些输入检查.或者一些默认值.或者不显示输入的内容,因为您要求输入密码... (2认同)
  • 我会在“gets”之后附加“.chomp”方法,否则变量末尾将包含“\n”换行符。 (2认同)

小智 32

一个班轮黑客确定.优雅......不完全是.

input = [(print 'Name: '), gets.rstrip][1]
Run Code Online (Sandbox Code Playgroud)

  • 我认为`input =(print'Name:'; gets.rstrip)`更具可读性.但这两种解决方案都存在"nil"值的问题.在Ruby 2.3中,可以使用`input =(print'Name:'; gets&.rstrip)`来优雅地处理它们. (2认同)

Tia*_*dez 12

关注@Bryn的领导:

def prompt(default, *args)
  print(*args)
  result = gets.strip
  return result.empty? ? default : result
end
Run Code Online (Sandbox Code Playgroud)


Add*_*son 12

我知道这个问题已经过时了,但我会说明我用什么作为获取输入的标准方法.

require 'readline'

def input(prompt="", newline=false)
  prompt += "\n" if newline
  Readline.readline(prompt, true).squeeze(" ").strip
end
Run Code Online (Sandbox Code Playgroud)

这是非常好的,因为如果用户在年底或年初增加了怪异的空间,它会删除这些,它不断的他们在过去进入了一个历史(更改true,以false不让它这样做).而且,如果ARGV不为空,那么gets将尝试从文件中读取ARGV,而不是获取输入.另外,它Readline是Ruby标准库的一部分,因此您无需安装任何gem.此外,使用时无法移动光标gets,但可以使用Readline.

并且,我知道方法不是一行,而是在你调用它时

name = input "What is your name? "
Run Code Online (Sandbox Code Playgroud)