【问题标题】:One liner in Ruby for displaying a prompt, getting input, and assigning to a variable?Ruby 中用于显示提示、获取输入和分配给变量的一个衬垫?
【发布时间】:2011-02-22 19:13:00
【问题描述】:

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

print "Input text: "
input = gets.strip

有没有一种优雅的方法可以在一行中做到这一点?比如:

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

这样做的问题是它在显示提示之前等待输入。有什么想法吗?

【问题讨论】:

  • 让它成为一个接受提示文本并返回输入文本的函数?如果您想变得更高级并且需要多个提示/输入循环,您可以使该函数采用一组提示和一个块,然后循环提示并产生每个输入。

标签: ruby input


【解决方案1】:

查看highline:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 那不是真正的单行;您正在使用分号,这可能不符合他要求的优雅部分。
    • $ ruby​​ -e 'print("输入文本:")||(input=gets.strip)&&(puts input)'
    【解决方案3】:

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

    def prompt(*args)
        print(*args)
        gets
    end
    
    name = prompt "Input name: "
    

    【讨论】:

    • 确实,这也可以。直到您想添加一些输入检查。或者一些默认值。或者不显示输入的内容,因为您要求输入密码...
    • 对于一个 5 秒的脚本,我会说这是要走的路。
    • 我会在gets 之后附加.chomp 方法,否则变量将在末尾包含\n 换行符。
    【解决方案4】:

    一个班轮黑客肯定。优雅……不完全是。

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

    【讨论】:

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

    在@Bryn 的带领下:

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

    【讨论】:

      【解决方案6】:

      我知道这个问题很老,但我会展示我使用什么作为获取输入的标准方法。

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

      【讨论】:

      • "注意:[Readline::readline] 终止 ruby​​ 解释器,并且在等待输入行时用户按下'^C'后不返回终端状态。"
      • 我喜欢这个和@Andrew Grimm 的建议作为使用highline/import的最佳替代方案@
      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 2022-10-04
        • 1970-01-01
        • 2016-04-29
        • 2022-01-22
        • 2021-11-10
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多