何时使用
适用:
- 用 Ruby/Rails 写惯用、可维护的代码,或对既有 Ruby 工程做架构与代码质量评审。
- 设计元编程能力(模块/mixin、DSL),用块与枚举器抽象复杂逻辑。
- 开发 gem 并管理依赖与版本;用 RSpec/Minitest 补测试;做性能剖析与优化。
不该用(负边界):
- 需要其他语言或运行时。
- 只需基础 Ruby 语法解释。
- 无法改动 Gemfile、
.rubocop.yml或工具链(代码生成与优化无从落地)。
步骤
- 对齐前提:确认 Ruby/Rails 版本、目标(功能/重构/调优)、约束与必需输入。
- 选型:依据场景选惯用法——元编程做 DSL、块与枚举器做迭代、组合优先于继承。
- 实现:遵循 Ruby/Rails 惯例与命名,异常用
rescue/ensure显式处理,配套 RSpec/Minitest。 - 优化:先测量后优化——用 benchmark-ips / ruby-prof 定位热点再调;可读性优先于性能。
- 验收:跑 RuboCop 静态检查与测试套件,输出重构建议;相关时附 Gemfile 与
.rubocop.yml。
指令
- 拥抱 Ruby 表达力:善用块、
Enumerable、关键字参数;元编程(define_method、method_missing、Module#included)服务于清晰的 DSL,而非炫技。 - 异常处理显式化:
begin/rescue/ensure收尾资源,按具体异常类捕获,不裸rescue。 - 可读性优先、性能其次:只在有 benchmark 数据时调优,禁止凭直觉。
- 测试用 RSpec 或 Minitest,配 fixtures/mocks;Rails 走 MVC,胖模型瘦控制器。
- 关键命令:
- 运行测试:
bundle exec rspec/bundle exec rake test - 静态检查与自动修复:
bundle exec rubocop/rubocop -a - 性能基准:
require "benchmark/ips"→Benchmark.ips { |x| x.report(...) ; x.compare! } - 剖析热点:
ruby-prof/stackprof - gem 脚手架与发布:
bundle gem <name>→ 在.gemspec用语义化版本 →gem build/gem push
- 运行测试:
示例
用 Benchmark.ips 对比两种实现:
require "benchmark/ips"
Benchmark.ips do |x|
x.report("map") { (1..1000).map { |i| i * 2 } }
x.report("each_with_object") do
(1..1000).each_with_object([]) { |i, a| a << i * 2 }
end
x.compare!
end
典型请求:
- "把这段遗留 Ruby 重构成惯用写法并补 RSpec"
- "为这个配置层设计一个简洁的 DSL"
- "用 benchmark-ips 定位并优化这段循环的瓶颈"
- "搭一个带语义化版本和测试的 gem 骨架"
注意事项
- 输出不能替代环境内的实测、测试与专家评审;落地前务必跑通测试套件与 RuboCop。
- 元编程会牺牲可读性与调试性,仅在收益明确时使用;优先简单方案。
- 输入、权限、安全边界或验收标准缺失时,先停下来澄清再动手。
- 仅在任务确实落在上述范围内时使用本技能。
互见
- Rails 后端架构、ActiveRecord 查询优化相关技能。
- 通用性能剖析与遗留代码现代化方法论。
- 测试策略与覆盖率(RSpec/Minitest)相关技能。
采编自 sickn33/antigravity-awesome-skills(MIT)。