在Ruby中从用户输入创建哈希数组

时间:2014-05-01 01:49:55

标签: ruby arrays hash block dynamic-arrays

我正在尝试创建一个简单的银行帐户程序来练习一些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) {}

然后我可以将键和值对推入哈希。我不知道我是否可以使用块来完成此操作或其他操作。我还是新手,所以如果我对这个问题感到沮丧,我会道歉。谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

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

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”的用户