【发布时间】:2014-10-24 10:40:14
【问题描述】:
是否有一些简单的方法可以在提供默认值的同时在 Ruby 中请求用户输入?
在 bash 中考虑这段代码:
function ask_q {
local PROMPT="$1"
local DEF_V="$2"
read -e -p "$PROMPT" -i "$DEF_V" REPLY
echo $REPLY
}
TEST=$(ask_q "Are you hungry?" "Yes")
echo "Answer was \"$TEST\"."
你能用 Ruby 的gets.chomp 实现类似的行为吗?
function ask_q(prompt, default="")
puts prompt
reply = gets.chomp() # ???
return reply
def
reply = ask_q("Are you hungry?", "Yes")
我知道我可以用这种方式排序复制 Ruby 中的功能......
def ask_q(prompt, default="")
default_msg = (default.to_s.empty?) ? "" : "[default: \"#{default}\"]"
puts "${prompt} ${default}"
reply = gets.chomp()
reply = (default.to_s.empty?) ? default : reply
return reply
end
...但它看起来不是很漂亮。我还需要手动显示默认值,如果用户想使用它的修改版本(比如yes! 而不是yes),他需要在提示行中重新键入它。
我现在开始使用 Ruby,所以可能有很多语法错误,而且我也可能遗漏了一些明显的东西......另外,我搜索了很多,但令人惊讶的是没有发现任何线索。
TL;博士
为了让问题更清楚,这是您应该在终端中看到的内容以及我在 bash 中能够实现的内容(到目前为止,在 Ruby 中还没有):
### Terminal output of `reply=ask_q("Are you hungry?" "Yes")`
$ Are you hungry?
$ Yes # default editable value
### Terminal output of `reply=ask_q("What do you want to eat?")`
$ What do you want to eat?
$ # blank line waiting for user input, since there is no second parameter
以及实际情况:我正在为我的网络应用程序构建引导脚本。我需要为用户提供现有的配置数据,他们可以根据需要进行更改。
### Terminal output of `reply=ask_q("Define name of database." "CURR_DB_NAME")`
我不认为这是需要切换到 GUI 应用程序世界的花哨功能。
正如我之前所说,这在 bash 中很容易实现。问题是,其他事情是纯粹的痛苦(关联数组,函数没有返回值,传递参数,......)。我想我只需要决定在我的情况下什么最不糟糕......
【问题讨论】:
-
这似乎是一个类似的问题:stackoverflow.com/questions/2314105/… 大多数答案也建议使用外部库。
-
我没有使用 bash,但这段代码应该适用于 TL;DR 部分:
def ask prompt, default = nil; unless default; return gets.chomp; end; return default; end;,您可以像这样使用它:ask 'what is your name'等待您的回复。ask 'what is your name', 'darek'这只是返回默认值。好吧,如果那是您正在寻找的代码,我会将其发布为答案并进行更多解释(因为评论部分有字符限制)。附言。或者有点骇人听闻的方式:def ask2 prompt, default = nil; default || gets.chomp; end; -
Derek:再一次,你的解决方案只是(更)优雅的方式来做我自己的
def ask_q,对吧?看我的问题。此外,默认答案应该只对用户建议,您的解决方案似乎强制它。我说的对吗? -
是的,你可以这样称呼它。此建议,您希望用户如何编辑您的建议?
-
Darek:查看函数的“bash 版本”或这个问题 - stackoverflow.com/questions/2642585/… - 它描述了 bash 中所需的确切行为。
标签: ruby bash default-value gets