【问题标题】:Creating an array of hashes from user input in Ruby从 Ruby 中的用户输入创建哈希数组
【发布时间】:2014-06-17 12:47:02
【问题描述】:

我正在尝试创建一个简单的银行账户程序来练习一些 Ruby。这个想法是创建一个哈希数组。但是,我想使用用户输入来创建一个新的哈希值,无论是创建标题还是简单地为 user1 或 user2 之类的条目编号。

如果我使用将用户名、密码和余额全部存储在哈希中的设置,如下所示:

jhip = {
  :pin => 1234,
  :balance => 1000000
}

jdog = {
  :pin => 2345,
  :balance => 1000
}

accounts = [
  jhip,
  jdog
]

我觉得在数组中找到正确的用户名和/或告诉用户他们的名字已经被选择比我使用这样的设置要容易得多:

user1 = {
  :username => "jhip",
  :pin => 1234,
  :balance => 1000000
}

user2 = {
  :username => "jdog",
  :pin => 2345,
  :balance => 1000
}

accounts = [
  user1,
  user2
]

这个问题的真正意义在于让用户输入成为哈希的标题。我知道创建这样的哈希的符号:

h = hash.new #or
hash = {}

但我不知道如何将输入用作标题。当我将输入存储为变量时,我可以使用该变量:

@username = gets.chomp
@username.to_i #or any method

但如果我尝试使用变量名创建哈希,我会覆盖输入。

@username = {} #no more using the response from gets

我想我要找的是类似的东西

@username = gets.chomp
@username.to_s => (some sort of code or command I'm unaware of) {}

然后我可以将键和值对推送到散列中。我不知道我是否可以使用块来完成此操作或其他操作。我对此仍然很陌生,所以如果我对这个问题的咀嚼超出了我的咀嚼能力,我深表歉意。感谢您的帮助。

【问题讨论】:

    标签: ruby arrays hash block dynamic-arrays


    【解决方案1】:

    以下将使用根据用户输入分配的用户名键创建一个哈希:

    puts "Hey what's your username?"
    username = gets.chomp
    user = {
      username: username,
      pin: 10,
      balance: 100
    }
    puts "Your account is: #{user}"
    

    类似地,以下代码会将新哈希插入到哈希数组中,并根据用户输入分配用户名键:

    def create_user(username)
      {
        username: username,
        pin: 10,
        balance: 100
      }
    end
    
    accounts = []
    puts "Hey what's your username?"
    username = gets.chomp
    accounts.push(create_user(username))
    puts "There are #{accounts.length} accounts"
    

    为了在数组中找到一个元素,您可以简单地遍历每个元素并返回该元素的用户名是否与正确的用户名匹配。例如

    accounts = [create_user('alice'), create_user('bob')]
    
    def find_by_username(accounts, username)
      accounts.each do |user|
        return user if user[:username] == username
      end
      nil
    end
    
    puts find_by_username(accounts, 'alice')
    puts find_by_username(accounts, 'bob')
    puts find_by_username(accounts, 'charles')
    

    如果用户名与给定的用户名匹配,此方法将遍历每个用户并返回用户。如果不存在这样的用户,它将返回nil

    Ruby 很好,因为其中很多类型的动作都被抽象出来了——数组响应find 方法,该方法返回与代码块匹配的第一个元素,如果不存在这样的元素,则返回 nil。所以find_by_username 的替代实现是

    def find_by_username2(accounts, username)
      accounts.find do |user|
        user[:username] == username
      end
    end
    

    或者更简洁

    def find_by_username3(accounts, username)
      accounts.find { |user| user[:username] == username }
    end
    

    但是,每次您想通过用户名查找用户时循环遍历哈希数组是一个相对较慢的操作。如果您要改为使用哈希哈希,则数据结构可能如下所示:

    accounts = {
      "alice" => { pin: 312, balance: -100 },
      "bob"   => { pin: 104, balance: 1000 }
    }
    

    您将能够通过accounts["bob"]找到用户名为“bob”的用户

    【讨论】:

    • 哇,太简单了。我将如何在您创建的数组中搜索用户?假设有人想检查余额,您以相同的方式询问他们的用户名。我假设我不会输入 accounts[username:]
    • 那个更新真的很有帮助。我最近了解到,通过哈希搜索只需要一次迭代,所以正如你提到的,时间会大大减少。我将更改我的小程序以合并它。
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2018-08-24
    • 2023-03-07
    • 2022-01-10
    • 2023-03-21
    • 2015-04-19
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多