Ruby 如何使用YAML进行读/写操作?
我一直在尝试编写一个程序,通过STDIN处理以空格分隔的参数Ruby 如何使用YAML进行读/写操作?,ruby,Ruby,我一直在尝试编写一个程序,通过STDIN处理以空格分隔的参数 echo "Add Tom 4111111111111111 $1000" | ruby basicCC.rb echo "Charge Tom $500" | ruby basicCC.rb echo "Charge Tom $800" | ruby basicCC.rb 这是我的代码: load 'creditCard.rb' require 'yaml' people = YAML::load_file "settings.y
echo "Add Tom 4111111111111111 $1000" | ruby basicCC.rb
echo "Charge Tom $500" | ruby basicCC.rb
echo "Charge Tom $800" | ruby basicCC.rb
这是我的代码:
load 'creditCard.rb'
require 'yaml'
people = YAML::load_file "settings.yml"
puts people.inspect
data = ARGF.read
puts people
def run(file, people)
rand_num = Random.rand(9999)
file.each_line do |line, index|
line = line.split(' ')
function = line[0]
if function == 'Add'
name, cc, limit = line[1..-1]
limit = limit[1..-1].to_i
people[name] = Credit.new(name, cc, limit)
elsif function == 'Charge'
name, amount = line[1..-1]
amount = amount[1..-1].to_i
if people[name].nil?
puts "Could not find #{name}"
else
people[name].charge(amount)
end
elsif function == 'Credit'
name, amount = line[1..-1]
amount = amount[1..-1].to_i
if people[name].nil?
puts "Could not find #{name}"
else
people[name].credit(amount)
end
end
puts people
File.open("settings.yml", "w") do |file|
file.write people[name].to_yaml
end
end
end
run(data, people)
我不知道如何写入和读取我的settings.yml。我无法执行Charge Tom$500,因为没有可读取和编辑的数据 您说您试图从命令行读取以空格分隔的参数,然后说问题是无法读取YAML文件。当你问一个问题时,很重要的一点是要清楚你想用这个问题完成什么。如果不能做到这一点,将导致投票被否决,问题也将被解决 你的代码结构不是很好。我会像这样编写未经测试的代码:
require 'yaml'
require_relative 'creditCard.rb'
def process_data(new_data, data_store)
new_data.each_line do |line, index|
line = line.split
function = line.shift
case function
when 'Add'
name, cc, limit = line
limit = limit[1..-1].to_i
data_store[name] = Credit.new(name, cc, limit)
when 'Charge'
name, amount = line
amount = amount[1..-1].to_i
if data_store[name]
data_store[name].charge(amount)
else
puts "Could not find #{name}"
end
when 'Credit'
name, amount = line
amount = amount[1..-1].to_i
if data_store[name]
data_store[name].credit(amount)
else
puts "Could not find #{name}"
end
end
puts data_store
File.write("settings.yml", data_store.to_yaml)
end
end
people = YAML::load_file "settings.yml"
process_data(ARGF.read, people)
代码中突出的内容:
格式间距和缩进不好。代码中需要有空格,这让我们的眼睛和大脑更容易看到逻辑。空白不会降低程序的执行速度,而且在维护代码时会产生很大的差异,所以请将其放入。
如果正在从同一目录中的单独文件读入代码,请使用require_relative。另外,不要使用camelCase命名文件,请使用snake\u case。这是另一种可读性的东西。
不要调用方法运行。使用一个名称来指示它正在做什么或将要返回什么。在这种情况下,run没有任何意义,但process_data有。
用于传入数据的参数名称并不反映数据是什么,但是这些名称加上方法的名称应该可以很好地提示例程的功能
process_data(new_data, data_store)
告诉我们的不止这些
run(file, people)
拆分“”的操作与拆分相同,因此请使用较短的形式
function=line[0]强制您重复访问第[1..-1]行。改为使用line.shift,它将清除对第[1]行的其他访问。
if/elseif/else链条有噪音。case/when可以很好地清理链条。
您没有将完整的YAML文件写回磁盘,而是用单个名称的信息覆盖该文件。我认为这不是您的意图,所以
File.write("settings.yml", data_store.to_yaml)
将重写整个文件,这应该解决问题。是否尝试将YML作为存储库?这不是一个非常好的用例。如果你想要一个轻量级的基于文件的存储库,你应该考虑SQLite。YML主要用于基于文本的配置文件。它们是只读的……是SQLite + Ruby教程,当然是SH。为了满足这个要求,我们应该使用Sqlite。但我想指出几个方面:1.如果在双引号中提供,则前面带有\美元\符号\的echo$将被插值为环境变量。因此,可以对其进行转义,也可以使用单引号。2.可能尝试使用STDIN.readlines进行解析。3.还要检查yaml文件是否正确。不要使用directly到SQLite。这将您的代码与DBM紧密地联系在一起,并使移植到另一个DBM更加容易。相反,请看一下使用ORM,它可以消除痛苦,使开发、测试和在生产中运行变得非常容易,并且在将来,可以很容易地转移到PostgreSQL、MySQL或Oracle。我建议使用。@nanSTA,您试图在我的答案中通过编辑删除代码。不要这样做。