Как l oop через массив хэшей найти имя пользователя в ruby? - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь просто l oop через этот массив хешей найти имя пользователя, которое ищет пользователь. Проблема заключается в том, что всякий раз, когда я ищу что-либо, кроме первого значения, которое оно не заполняет.

 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 

Ответы [ 3 ]

2 голосов
/ 10 января 2020

Обе ветви if user_record[:username] == temp_username используют break.

Это означает, что ваш l oop всегда будет конечным sh после первой итерации.

Как совет, вы можно попробовать переписать ваш код следующим образом:

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

user = users.find { |user_record| user_record[:username] == temp_username }

if user
  puts "Succesfully Logged In"
else
  puts "Please try again"
end
1 голос
/ 10 января 2020

Похоже, вы хотите продолжать спрашивать имя пользователя, пока не найдете пользователя, который вошел в систему; то есть до тех пор, пока h[:username] не совпадет с именем, введенным для одного из хэшей h в users. Если это так, вы хотите сначала создать al oop, который отображает результат для каждого введенного имени пользователя и предоставить способ вырваться из l oop, когда найден вошедший в систему пользователь.

loop do
  ...
  <display result for current user entry>
  <break if named user is logged in>
end

См. Ядро # l oop. Сначала вам нужно получить имя пользователя.

loop do
  print "Username: "
  name = gets.chomp
  ...
  <display result for current user entry>
  <break if the value of name is logged in>
end

Теперь нам нужно найти , зарегистрировано ли значение name.

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

См. Enumerable # find . find возвращает га sh h, для которого h[:username] == name равно true, если users содержит такой га sh, в противном случае возвращается nil.

Последний шаг для отображения результата и прерывания от l oop, если указанный пользователь вошел в систему.

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
1 голос
/ 10 января 2020

Согласно вашей логике c, вы получите break от l oop в первом элементе. Полагаю, вам следует немного его изменить.

    ...
    temp_username = gets.chomp
    user = users.find { |u| u[:username] == temp_username } 

, если есть пользователь с именем пользователя, равным temp_username - он назначит первого переменной user. Тогда:

  if user
    puts "Succesfully Logged In"
  else
    puts "Please try again"
  end
...