Arrays 如何在ruby中循环通过哈希数组来查找用户名?

Arrays 如何在ruby中循环通过哈希数组来查找用户名?,arrays,ruby,loops,hash,Arrays,Ruby,Loops,Hash,我试图循环使用这个散列数组来查找用户搜索的用户名。问题是每当我搜索除第一个值以外的任何内容时,它都不会填充 users = [ { username: "mashrur", password: "password1" }, { username: "jack", password: "password2" }, { username: "arya", password: "password3" }, { usern

我试图循环使用这个散列数组来查找用户搜索的用户名。问题是每当我搜索除第一个值以外的任何内容时,它都不会填充

 users = [
          { username: "mashrur", password: "password1" },
          { username: "jack", password: "password2" },
          { username: "arya", password: "password3" },
          { username: "jonshow", password: "password4" },
          { username: "heisenberg", password: "password5" }
        ]
puts "Username"
temp_username = gets.chomp
users.each do |user_record|
  if user_record[:username] == temp_username
    puts "Succesfully Logged In"
    break
  else
    puts "Please try again"
    break
  end
end 

if user\u record[:username]==temp\u username
的两个分支都使用
break

这意味着您的循环将始终在第一次迭代之后完成

作为建议,您可以尝试用以下方式重写代码:

用户=[
{用户名:“mashrur”,密码:“password1”},
{用户名:“jack”,密码:“password2”},
{用户名:“arya”,密码:“password3”},
{用户名:“jonshow”,密码:“password4”},
{用户名:“海森堡”,密码:“password5”}
]
输入“用户名”
temp\u username=gets.chomp
user=users.find{| user_record | user_record[:username]==temp_username}
如果用户
放入“成功登录”
其他的
放入“请再试一次”
结束

根据您的逻辑,您将在第一个元素处从循环中断开。 我想你应该改变一下

    ...
    temp_username = gets.chomp
    user = users.find { |u| u[:username] == temp_username } 
如果有任何用户的用户名等于
temp_username
,它将第一个用户名分配给
user
变量。 然后:


听起来你想一直询问用户名,直到找到一个登录的用户;也就是说,直到
h[:username]
等于为
users
中的一个哈希值
h
输入的名称。如果是这样,您希望首先构造一个循环,显示输入的每个用户名的结果,并提供在找到登录用户时中断循环的方法

loop do
  ...
  <display result for current user entry>
  <break if named user is logged in>
end
find
返回哈希值
h
,如果
users
包含此类哈希值,则返回
nil

最后一步是显示结果,如果指定用户登录,则中断循环

users = [
  { username: "mashrur", password: "password1" },
  { username: "jack", password: "password2" },
  { username: "arya", password: "password3" },
  { username: "jonshow", password: "password4" },
  { username: "heisenberg", password: "password5" }
]

loop do
  print "Username: "
  name = gets.chomp
  found = users.find { |h| h[:username] == name }
  ...
  <display result for current user entry>
  <break if the value of name is logged in>
end
loop do
  print "Username: "
  name = gets.chomp
  found = users.find { |h| h[:username] == name }
  puts found.nil? ? "Please try again" : "Succesfully Logged In"
  break unless found.nil?
end
下面是一个对话示例:

Username: bob
Please try again
Username: sue
Please try again
Username: jack
Succesfully Logged In

您选择的答案表明,如果输入的第一个用户名未登录,您只需停止。如果是,为什么会提示“重试”?(另外,我不知道你所说的“填充”是什么意思。)提醒Ruby没有Rail的方法
present
。(无导轨标记。)
loop do
  print "Username: "
  name = gets.chomp
  found = users.find { |h| h[:username] == name }
  puts found.nil? ? "Please try again" : "Succesfully Logged In"
  break unless found.nil?
end
Username: bob
Please try again
Username: sue
Please try again
Username: jack
Succesfully Logged In