Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用YAML进行读/写操作?_Ruby - Fatal编程技术网

Ruby 如何使用YAML进行读/写操作?

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

我一直在尝试编写一个程序,通过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.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,您试图在我的答案中通过编辑删除代码。不要这样做。