Ruby中如何验证用户输入邮箱满足非空、含@及点号条件?
问题分析与解决方法
你的代码核心问题是条件判断逻辑完全错误:
- 原代码的
if email.empty? && email.include?("@") && email.include?(".")要求输入为空的同时包含@和.,这本身就是矛盾的,永远不会触发puts "working",必然走else分支重新输入。 - 正确的逻辑应该是:输入非空(
!email.empty?),并且包含@,同时包含.。
另外,递归调用email()虽然能实现重复输入,但多次输入后可能触发栈溢出,更推荐用循环实现。
修复后的递归版本
def email() print "What is the students email? " email = gets.chomp # 修正条件:非空 + 包含@ + 包含. if !email.empty? && email.include?("@") && email.include?(".") puts "working" else puts "Please enter a valid email. " email() end end email()
更优的循环版本(避免栈溢出)
def get_valid_email loop do print "What is the student's email? " email = gets.chomp if !email.empty? && email.include?("@") && email.include?(".") puts "working" break # 验证通过后退出循环 else puts "Please enter a valid email." end end end get_valid_email()
补充说明
如果需要更严谨的邮箱验证,可以使用正则表达式(比如/\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i),但你当前需求的三个基础验证,修正条件逻辑就足够解决问题。
内容的提问来源于stack exchange,提问作者user19408396
相关产品推荐
相关产品推荐

