-2

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

user_accts 是数组。

更新完整的 if/else 语句:

elsif choice == "2" puts "====== NEW CUSTOMER ======" puts "Choose a username:" 提示;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 << create_account(login_name, login_password)

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}
4

3 回答 3

2

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

假设您已将文本文件解析为@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
于 2013-05-21T15:37:01.547 回答
0

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

我有一个类似的问题,最终决定数据库是要走的路。

于 2013-05-21T17:55:23.963 回答
0
@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
于 2013-05-21T15:42:16.650 回答