Программа Ruby завершает работу при вызове функции внутри функции - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь получить что-то, где, если кто-то входит в строку, он проверяет это и запускает другую функцию. Моя проблема заключается в том, что он завершает программу вместо запуска другой функции. Вот мой код:

puts "redirecting to login"
def login()
  puts ""
  print "Username: "
  username = gets.chomp
  checkusername()
end
def password()
  print "Password: "
  passwordconf = gets.chomp
  checkpassword()
end
def success()
  puts "You're logged in!"
  loop { sleep 10 }
end
def checkusername()
if username == name
  password()
else
  login()
end
end
def checkpassword()
if passwordconf == password
  success()
else
  login()
end
end
login()
loop { sleep 10 }

Когда логин запущен, и я набираю get для строки, которую я пытаюсь проверить, когда я нажимаю enter для запуска checkusername, программа завершается, даже если она правильная.

Функция входа в систему запускает функцию checkusername, когда я набираю строку и нажимаю ввод. Моя проблема в том, что, как только это происходит, программа завершает свою работу, вместо того, чтобы либо перенаправить обратно на функцию входа в систему или функцию пароля. Я пытаюсь понять, как этого не произойдет.

Ошибка вывода:

Traceback (most recent call last):
        2: from blank.rb:41:in `<main>'
        1: from blank.rb:16:in `login'
blank.rb:28:in `checkusername': undefined local variable or method `username' for main:Object (NameError)

Я довольно новичок в Ruby, и я потратил довольно много времени, чтобы заставить это работать, но я не в состоянии. Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018
puts 'redirecting to login'

def login
  puts  # You do not need the quotes just to put an empty line
  print 'Username: '
  username = gets.chomp
  check_username username  # I recommend using snake_case for variable names and method names
end

def password
  print 'Password: '
  password_conf = gets.chomp
  check_password password_conf
end

def success  # With Ruby you do not need the empty ()
  puts "You're logged in!"
end

def check_username(username)
  name = 'random'
  username == name ? password : login  # This is a if/else statement on one line
end

def check_password(password_conf)
  password = 'password'
  password_conf == password ? success : login  # You also don't need the () for calling a method either
end

login
loop { sleep 10 } # This will keep the program running forever, you should probably remove this line

Я внес некоторые изменения в ваш код, с некоторыми комментариями выше.

Переменные, которые не являются глобальными (вам следует избегать глобальных переменных), необходимо передать в метод для использования. Это основная причина сбоя вашей программы. Вы просите метод checkusername использовать переменную в методе login, которая не будет работать, поскольку методы не будут совместно использовать переменные, если вы не передадите их.

Опять же, я бы по возможности избегал глобальных переменных.

0 голосов
/ 02 мая 2018

Вы получаете сообщение об ошибке, потому что username неизвестно в функции checkusername(). Говорят, что выходит за рамки . Он не известен за пределами функции login(). Это локальная переменная. Его область действия локальна для login().

Одним из способов решения этой проблемы является объявление переменной global . Это означает, что он будет иметь глобальный охват и будет доступен из любой точки программы. Чтобы объявить переменную как глобальную, вы должны использовать префикс $.

username = gets.chomp становится $username = gets.chomp. Затем, когда вы захотите сослаться на него снова, вы используете тот же префикс: if $username == name...

Разница между областями действия различных переменных в рубине

http://ruby -for-beginners.rubymonstas.org / writing_methods / scopes.html

( Edit! Как отмечает Серхио Туленцев ниже, глобальные переменные обычно плохая идея. https://www.thoughtco.com/global-variables-2908384)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...