Рекурсивный цикл для проверки пароля в Ruby - PullRequest
2 голосов
/ 25 мая 2011

ОК, я пытаюсь написать простой объект, который будет содержать две строки, одну - «пароль пользователя» и одну - «целевой пароль», это понадобится, если вы захотите написать сценарий изменения пароля на удаленном сервере, используяsudo (первым паролем будет выполнение команды sudo, «целевой пароль» будет строкой, в которую должен быть сброшен пароль.

Я хочу, чтобы у пользователя один раз запрашивался первый пароль, итогда у пользователя будет пять попыток ввести вторую строку пароля и точно ее повторить. То, что я придумал, приведенный ниже код, похоже, не работает. Есть идеи?

require 'pp' 
require 'RubyGems'
require 'highline/import'  #gem install highline

class Authorization

attr_reader :user_password , :target_password

 pass_code = lambda {
 first_attempt = ask("Enter target password:  "){ |q| q.echo = '*' }
 second_attempt = ask("Re-enter password to verify"){ |q| q.echo = '*'}
}

 ### So we need some sort of recursive loop

def initialize(target_pass=false)
@user_password = ask("Enter your admin password:  ") { |q| q.echo = '*' }

if target_pass
  count = 1
  while n < 6
  pass_code

      if first_attempt == second_attempt
        @target_password =  first_attempt
        return
      else
        count += 1  
      end
    end
  end 

    end
  end

   my_pass = Authorization.new(true)

   pp "pass" , my_pass

Ответы [ 4 ]

2 голосов
/ 25 мая 2011

вижу несколько проблем

  • Это require "rubygems" (не RubyGems)
  • Кроме того, при использовании Ruby 1.9 загрузка рубинов не требуется.
  • Лямбда имеет локально назначенные переменные, которые недоступны в конструкторе
  • Само по себе лямбда-определение выходит за рамки доступа
  • Цикл никогда не заканчивается (кстати, это не рекурсия).

Попробуйте вместо этого что-нибудь подобное.

require "highline/import"

class Authorization
  attr_accessor :user_password, :target_password

  def prompt(prompt_for_target = false)
    self.user_password = ask_for_password("Enter your admin password")
    return unless prompt_for_target

    5.times do
      password     = ask_for_password("Enter target password")
      confirmation = ask_for_password("Re-enter password to verify")

      if password == confirmation
        self.target_password = password
        return
      end
    end
  end

  private

  def ask_for_password(message)
    ask("#{message}: ") { |q| q.echo = '*' }
  end
end

auth = Authorization.new
auth.prompt(true)

puts auth.user_password
puts auth.target_password
1 голос
/ 25 мая 2011

Во-первых, спасибо всем за ваши ответы. Это был мой первый вопрос, и, к сожалению, он вышел немного искаженным, но все вы, кажется, понимали его очень хорошо.

ИМХО, что я пытался сделать рекурсию, но я не уверен, что это лучшее место для этой дискуссии.

Я использую Ruby 1.8.7, о котором я, вероятно, должен был упомянуть в начале поста. Решение Райана сработало, но только когда я убрал ссылки на «себя» и подставил в переменную экземпляра:

@user_password = ask_for_password("Enter your admin password") #instead of
self.user_password = ask_for_password("Enter your admin password")  

это может быть необязательно для Ruby 1.9, но у него есть преимущество в том, что он делает простосупер почти идентичным Райану.

Еще раз спасибо всем! Это был отличный опыт "промокания ног".

1 голос
/ 25 мая 2011

Довольно просто и похоже на решение Райана:

require 'highline/import'  #gem install highline

class Authorization

  attr_reader :admin_password, :target_password

  def initialize
    @admin_password = ask_for_password("Enter your admin password: ")
    5.times do
      @target_password = ask_for_password("Enter target password: ")
      verify_target_pass = ask_for_password("Re-enter password to verify: ")
      break if @target_password == verify_target_pass
      @target_password = nil
    end

  end 

  private

  def ask_for_password(message)
    ask(message) {|q| q.echo = "*"}
  end

end

my_pass = Authorization.new
puts "Administrator's password is: #{my_pass.admin_password}"
puts "Target password is: #{my_pass.target_password}"
0 голосов
/ 25 мая 2011

Во-первых, это не рекурсия .Это итерация .Рекурсивная функция будет вызывать себя снова:

def factorial(n)
    if (n == 0)
        1
    else
        n * factorial(n-1)
    end
end

Теперь, для конкретной проблемы, которую вы получили;вы пытаетесь выполнить цикл с условием:

while n < 6

Но обратите внимание, что в теле вашего цикла вы ничего не делаете для изменения значения n.Таким образом, ваш цикл не может завершиться.(Кроме того, поскольку вы забыли присвоить значение n, оно, вероятно, также не может start .:)

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