如何解决Ruby中用于密码检查的递归循环
| 好的,我正在尝试编写一个简单的对象,其中包含两个字符串,一个为“用户密码”,一个为“目标密码”,如果要在远程服务器上编写密码更改脚本,则需要使用此对象使用sudo(第一个密码是执行sudo命令,\“ target password \”是应将密码重置为的字符串。 我希望一次提示用户输入第一个密码,然后用户将尝试五次输入第二个密码字符串并准确地重复输入。我想出的下面的代码似乎不起作用。有任何想法吗?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
解决方法
我看到几个问题
require \"rubygems\"
(不是RubyGems)
另外,如果使用Ruby 1.9,则不需要加载rubygems。
Lambda分配了局部范围的变量,这些变量在构造函数中不可用
lambda定义本身超出了访问范围
循环永远不会终止(顺便说一句,这不是递归的)。
尝试这样的事情。
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
,非常简单,类似于Ryan的解决方案:
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}\"
,首先,谢谢大家的回答。这是我的第一个问题,不幸的是,出现了一些乱码,但是你们所有人似乎都非常了解它。
恕我直言,我正在尝试进行递归,但是我不确定这是进行讨论的最佳场所。
我正在使用Ruby 1.8.7,我可能应该在文章开头提到它。 Ryan \的解决方案有效,但仅当我取出对“ self”的引用并替换为实例变量时:
@user_password = ask_for_password(\"Enter your admin password\") #instead of
self.user_password = ask_for_password(\"Enter your admin password\")
这对于Ruby 1.9可能不是必需的,但是它确实具有使prostosuper与Ryan几乎相同的优点。
再次感谢大家!这是很棒的“弄湿我的脚”的经验。
,首先,这不是递归。这是迭代。递归函数将再次调用自身:
def factorial(n)
if (n == 0)
1
else
n * factorial(n-1)
end
end
现在,针对您遇到的特定问题;您正在尝试循环以下条件:
while n < 6
但是请注意,在循环的主体中,您没有做任何更改n
的值的操作。因此,您的循环无法终止。 (此外,由于您首先忘记为n
分配一个值,它也可能无法启动。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。