第3章:Ruby语言基础高频面试题

本章定位:数据类型、块与迭代器、异常处理、常用内置方法是Ruby面试的“必考点”。掌握一套结构化回答框架,可以让你在5分钟内展现扎实的语言功底。
理解问题要点 选择数据类型 块与迭代器 异常处理策略 内置方法举例 回答时按此路径串联知识点,展示深度 ---

面试问答卡片

卡片1:Ruby基本数据类型有哪些?

面试问题请列举Ruby中的基本数据类型,并说明它们的特点。
考察点基础扎实度、类型系统理解、表达能力
回答框架分类列举 → 简要说明特点 → 举例说明 → 总结动态类型特性
示例回答Ruby基本数据类型包括:Integer(整数,如42)、Float(浮点数,3.14)、String(字符串,"hello")、Symbol(符号,:name)、Array(数组,[1,2])、Hash(哈希,{a:1})、Boolean(true/false)、Nil(nil)。Ruby是动态强类型语言,变量无需声明类型,但方法调用时会进行类型检查。
可能追问1. Symbol和String有什么区别?2. nil和false的区别?3. 如何判断一个对象的类型?
避坑提醒不要混淆“基本类型”与“对象”——Ruby中一切皆对象,Integer等也是对象。回答时强调Symbol不可变且重用,String可变;nil是唯一表示“无”的值,false是布尔假值。

卡片2:块(Block)和迭代器(Iterator)的使用

面试问题请解释Ruby中的块和迭代器,并举例说明常见用法。
考察点函数式编程思维、代码组织能力、对each/map的掌握
回答框架先定义块 → 说明它与方法的关系 → 列举常用迭代器(each, map, select) → 举例说明 → 说明yield和&block
示例回答块是Ruby中一段可传递的代码,用do...end或{}包裹。迭代器是调用块的方法,如array.each { |x| puts x }。常见迭代器:each遍历、map转换、select过滤、reduce累积。块通过yield调用或显式&block参数接收。例如:[1,2,3].map { |n| n*2 } #=> [2,4,6]。
可能追问1. 如何实现自己的迭代器?2. proc和lambda的区别?3. 块和方法的异同?
避坑提醒不要误认为块是对象——块本身不是对象,但可以转换为Proc。注意each和map的区别:each返回原数组,map返回新数组。面试时展示对yield和&block的理解会更出彩。

卡片3:异常处理机制

面试问题Ruby中如何处理异常?请写出典型的异常处理结构。
考察点错误处理意识、rescue/ensure用法、Exception层次
回答框架begin-rescue-ensure结构 → 多rescue捕获不同异常 → raise自定义异常 → ensure保证资源释放 → 常用内置异常类
示例回答begin # 可能出错的代码 file = File.open("data.txt") content = file.read rescue Errno::ENOENT => e puts "文件不存在: #{e.message}" rescue StandardError => e puts "其他错误: #{e.message}" ensure file&.close # 确保关闭文件 end
可能追问1. rescue Exception和rescue StandardError的区别?2. retry关键字的作用?3. 如何自定义异常类?
避坑提醒务必避免rescue Exception(会捕获所有系统级异常),应使用rescue StandardError。记住ensure块总是执行,用于资源清理。在Rails中常用rescue_from处理控制器异常。
---

项目案例章节

项目名称:电商平台订单处理系统 (Order Service)
业务背景为一家中型电商平台开发订单处理微服务,负责接收用户订单、校验库存、扣减库存并生成发货单。
规模指标日订单量约50万;SKU数量100万+;QPS峰值3000;99分位响应时间<200ms。
技术栈Ruby 3.0 + Rails 6.1 + PostgreSQL + Redis + Sidekiq + Kafka
核心难点1. 高并发下库存超卖问题(Redis Lua脚本+乐观锁)
2. 大JSON哈希遍历性能优化(改用Symbol键,减少对象创建)
3. 异常时订单状态回滚(事务+自定义异常类)
面试高频追问1. 如何用Ruby的块实现数据库事务?(Model.transaction do ... end)
2. Sidekiq中异常重试机制如何实现?
3. 大量订单数据用each还是find_each?为什么?
可迁移回答话术“在库存扣减场景中,我使用Redis的EVAL脚本保证原子性,同时结合Ruby的begin-rescue捕获Redis连接异常。对于大集合遍历,我优先使用find_each分批加载,避免内存爆炸。异常处理时,我会自定义OrderError继承自StandardError,并配合ensure释放锁资源。”
注意:项目案例回答时应聚焦“Ruby特性如何解决实际问题”,例如块用于事务、迭代器用于批量处理、异常处理用于回滚。避免只讲业务逻辑,要与本章知识点强关联。