我想请求用户输入,但我只想做一次(可能会将信息保存在程序中),意思是这样的:
print "Enter your name (you will only need to do this once): "
name = gets.chomp
str = "Hello there #{name}" #<= As long as the user has put their name in the very first
# time the program was run, I want them to never have to put thier name in again
我怎样才能在Ruby程序中做到这一点?
该程序将由多个用户全天在多个系统上运行。我曾试图将其存储到内存中,但显然失败了,因为据我所知,每次Ruby程序停止执行时,内存都会被擦除。
我的尝试:
def capture_user
print 'Enter your name: '
name = gets.chomp
end
#<= works but user has to put in name multiple times
def capture_name
if File.read('name.txt') == ''
print "e[36mEnter name to appear on email (you will only have to do this once):e[0m "
@esd_user = gets.chomp
File.open('name.txt', 'w') { |s| s.puts(@esd_user) }
else
@esd_user = File.read('name.txt')
end
end
#<= works but there has to be a better way to do this?
require 'tempfile'
def capture_name
file = Tempfile.new('user')
if File.read(file) == ''
print "e[36mEnter name to appear on email (you will only have to do this once):e[0m "
@esd_user = gets.chomp
File.open(file, 'w') { |s| s.puts(@esd_user) }
else
@esd_user = File.read(file)
end
end
#<= Also used a tempfile, this is a little bit over kill I think,
# and doesn't really help because the users can't access their Appdata
您需要将用户名存储在本地文件系统的一个文件中。Ruby提供了许多实现这一点的方法,我们将在这个答案中探索其中一种:YAML文件。
YAML文件是一个结构化存储文件,可以存储各种不同的数据,是存储配置数据的好地方。事实上,YAML配置文件是现存最大Ruby项目的关键部分。YAML为您提供了一个很好的起点来支持当前配置需求之外的未来配置需求,这是规划功能开发的好方法。
那么,它是如何工作的呢?让我们使用YAML配置来查看您的需求:
require 'yaml'
config_filename = "config.yml"
config = {}
name = nil
if file_exists(config_filename)
begin
config = YAML.load_file(config_filename)
name = config["name"]
rescue ArgumentError => e
puts "Unable to parse the YAML config file."
puts "Would you like to proceed?"
proceed = gets.chomp
# Allow the user to type things like "N", "n", "No", "nay", "nyet", etc to abort
if proceed.length > 0 && proceed[0].upcase == "N"
abort "User chose not to proceed. Aborting!"
end
end
end
if name.nil? || (name.strip.length == 0)
print "Enter your name (you will only need to do this once): "
name = gets.chomp
# Store the name in the config (in memory)
config["name"] = name
# Convert config hash to a YAML config string
yaml_string = config.to_yaml
# Save the YAML config string to the config file
File.open(config_filename, "w") do |out|
YAML.dump(config, out)
end
end
这段代码没有向您展示满足您需求的最低限度,而是在配置文件中包含了一些错误处理和一些简单的安全检查。它可能足够强大,您可以立即使用。
第一个部分只需要YAML标准库。这使得YAML函数在您的程序中起作用。如果您有一个加载器文件或类似的其他常见机制,只需将require 'yaml'
放在那里即可。
之后,我们初始化一些在此过程中使用的变量。您应该注意,config_filename
中没有路径信息,因此它将从当前目录中读取。您可能希望将配置文件存储在公共位置,例如~/.my-program-name/config.yml
或C:Documents and SettingsMyUserNameApplication DataMyProgramName
中。这可以很容易地完成,而且有很多帮助,比如在Windows中放置用户配置文件的位置和在linux/unix中的ini/Config文件的位置。
接下来,我们检查文件是否真的存在,如果是,我们尝试从中读取YAML内容。YAML.load_file()
方法处理这里的所有繁重工作,所以你只需要询问为你感兴趣的密钥返回的配置哈希,在这种情况下,就是"name"
密钥。
如果在读取YAML文件时发生错误,则表明该文件可能已损坏,因此我们尝试处理此问题。YAML文件很容易手动编辑,但当你这样做时,你也可以很容易地引入一个错误,使加载YAML文件失败。这里的错误处理代码将允许用户中止程序并返回以修复YAML文件,这样它就不会被简单地覆盖。
之后,我们尝试查看是否从YAML配置中获得了有效的名称,如果没有,我们继续接受用户的名称。一旦他们输入了一个名称,我们将其添加到配置哈希中,将哈希转换为YAML格式的字符串,然后将该字符串写入配置文件。
这就是一切。几乎所有可以存储在Ruby散列中的东西都可以存储在YAML文件中。这对于存储配置信息来说是非常强大的,如果以后需要添加更多的配置选项,那么您就有了一个通用的容器,可以完全用于此目的。
如果你想进一步阅读YAML,你可以在这里找到一些好的信息:
- YAML在Ruby教程中的机器人没有心脏
- 在Juixe Techknow上干扰Ruby YAML
- YAML谈与Ruby的斗争
虽然其中一些文章有点老,但它们仍然非常相关,会给你一个进一步阅读的起点。享受
如果需要在多次运行脚本的用户中保持名称,则需要使用某种数据存储。尽管我很讨厌平面文件,但如果你存储的只是用户名,我认为这是一个有效的选择。
if File.exist?('username.txt')
name = File.open( 'username.txt', 'r' ) do |file|
name = file.gets
end
else
print "Enter your name (you will only need to do this once): "
name = gets.chomp
File.open( 'username.txt', 'w' ) do |file|
file.puts name
end
end
str = "Hello there #{name}"