【问题标题】:How would I access a key from a hash that is within an array that is within a text file in ruby?如何从 ruby​​ 文本文件中的数组中的哈希访问密钥?
【发布时间】:2024-01-23 19:40:01
【问题描述】:

我正在尝试创建一个 if/else 语句,它将用户的输入与存储在文本文件中的哈希中的所有名称键进行比较。这个要怎么写?

user_accts 是数组。

更新完整的 if/else 语句:

elsif 选择 == "2" 提出“======新客户====== 放“选择一个用户名:” 迅速的; login_name = 获取.chomp

    #file.open("cust_accts.txt", "r")

    #if @user_accts.map { |acct| acct["name"]}.include?(login_name)
    if @user_accts.any? {|acct| acct["name"] == login_name }
        puts "Sorry, that username has already been taken" 
    elsif   
        puts "Choose a password:"
        prompt; login_password = gets.chomp

        user_accts << create_account(login_name, login_password)
        File.open("cust_accts.txt", "a") { |file| file.puts(user_accts)}            
    end     

原始 if/else 语句:

if login_name == #??? @user_accts.has_key?(login_name) ???
            puts "Sorry, that username has already been taken" 
        elsif   
            puts "Choose a password:"
            prompt; login_password = gets.chomp

            user_accts << create_account(login_name, login_password)
            File.open("cust_accts.txt", "a") { |file| file.puts(user_accts)}            
        end 

这正是使用此命令输入到 cust_accts.txt 文件的内容:

user_accts

File.open("cust_accts.txt", "a") { |file| file.puts(user_accts)}

cust_accts.txt

{"name"=>"Tom", "password"=>"popcorn", "balance"=>0}
{"name"=>"Avril", "password"=>"chain", "balance"=>0}

【问题讨论】:

  • @user_accts 包含什么?它看起来怎么样?
  • user_accts 是数组还是哈希?
  • @user_accts 是一个包含哈希的数组
  • 你能把你的文本文件解析成一个 ruby​​ 对象吗?您是创建此文本文件还是依赖其他人?
  • 这是我创建的文本文件。是否需要在文本文件中有这部分? --> @user_accts =

标签: ruby arrays hash


【解决方案1】:

不太清楚你的出发点是什么。

假设您已将文本文件解析为 @user_accts,那么您有:

@user_accts = [{"name"=>"Tom", "password"=>"popcorn", "balance"=>0},
               {"name"=>"Avril", "password"=>"chain", "balance"=>0}]

那么你会想做:

if @user_accts.map {|acct| acct["name"]}.include?(login_name)
  puts "Sorry, that username has already been taken"
else
  # ...
end

【讨论】:

  • 这似乎不起作用。它是否知道在检索信息之前必须先访问文本文件?
【解决方案2】:
@user_accts = [{"name"=>"Tom", "password"=>"popcorn", "balance"=>0},
               {"name"=>"Avril", "password"=>"chain", "balance"=>0}]


if @user_accts.any? {|acct| acct["name"] == "Tom" }
  puts "Sorry, that username has already been taken"
else
  # ...
end

#=> Sorry, that username has already been taken

【讨论】:

  • 这个解决方案似乎也不适合我。我看到你有:@user_accts = [{"name"=>"Tom", "password"=>"popcorn", "balance"=>0}, {"name"=>"Avril", "password" =>"chain", "balance"=>0}] 我的文本文件只有这部分:[{"name"=>"Tom", "password"=>"popcorn", "balance"=>0}, {"name"=>"Avril", "password"=>"chain", "balance"=>0}]
  • @LilithX 你运行这段代码了吗?为什么你认为它行不通? @user_accrts 和你的一样吗?
  • 是的,我刚刚运行了代码,当我输入文本文件中列出的用户名时,它只是跳过程序并退出。
  • @LilithX 您是否将文本文件内容读取到数组@user_accrts 中?如果是这样,请向我们展示该数组人口的代码。
  • Priti,我不确定您所说的“将文本文件内容读取到数组@user_accrts”是什么意思
【解决方案3】:

您的问题似乎是“如何将对象存储在 ruby​​ 中以备日后使用?”。如果您想使用文本文件,您需要将其转换为可以解析回 ruby​​ 对象(如 JSON 或 XML)的格式。不过,我建议使用数据库。像 SQLite 这样的数据库非常轻量级且易于学习。使用数据库的一个优点是,当您使用数据库时,您可以设置一个选项以将结果作为哈希返回。

我有一个similar problem,最终决定使用数据库是要走的路。

【讨论】:

  • 现在对我来说可能更高级一些。我是 ruby​​ 新手,仍在学习,但谢谢,我会在以后的项目中记住这一点。
  • 如果您不想使用数据库,那么您需要以 JSON 或 XML 格式编写文件,然后将其解析为 ruby​​ 对象。
  • @LilithX 这是学习练习还是您需要开始工作的项目?
  • 将数据保存到 txt 文件不是一个好的选择。如果您想查看本文中给出的任何示例工作,请将它们插入 IRB,它们都可以工作。您尝试做的最困难的部分是从文本文件中读取。 Ruby 只是将此文件视为一串 ASCII 字符,而不是 ruby​​ 对象。您可以使用数据库,或者将您的对象写入 ruby​​ 文件“user_accts.rb”,然后需要该文件。但我怀疑你试图做的并不是你想要的。
最近更新 更多