Ruby 速查表
最后更新
Hello World 与运行代码
Ruby 不需要任何样板代码,一行就能运行。
| 操作 | 语法 |
|---|---|
| 输出并换行 | puts "Hello, World!" |
| 输出不换行 | print "Hello" |
| 查看值的详细内容 | p [1, 2, 3] |
| 字符串插值 | puts "Hi #{name}" |
| 注释 | # this is a comment |
| 多行注释 | =begin ... =end |
| 运行文件 | ruby app.rb |
| 交互式命令行 | irb |
变量与类型
Ruby 是动态类型语言,一切皆对象。
| 操作 | 语法 |
|---|---|
| 局部变量 | age = 30 |
| 常量 | PI = 3.14 |
| 实例变量 | @name = "Ada" |
| 全局变量 | $count = 0 |
| 符号 | :status |
| nil / 布尔值 | nil, true, false |
| 查看类型 | 42.class 返回 Integer |
| 类型转换 | "42".to_i, 42.to_s, "3.5".to_f |
字符串
字符串是可变对象,自带丰富的方法。
| 操作 | 语法 |
|---|---|
| 长度 | "hello".length |
| 转大写 / 小写 | s.upcase, s.downcase |
| 去掉首尾空白 | s.strip |
| 替换 | s.gsub("a", "b") |
| 拆分成数组 | "a,b,c".split(",") |
| 是否包含子串 | s.include?("ell") |
| 截取字符 | s[0..2] |
| 拼接 | "foo" + "bar", s << "!" |
| 重复 | "ab" * 3 |
| 格式化 | format("%05d", 42) |
数组
有序、按整数索引的集合。
| 操作 | 语法 |
|---|---|
| 创建 | nums = [1, 2, 3] |
| 按索引访问 | nums[0], nums[-1] |
| 添加到末尾 | nums.push(4), nums << 4 |
| 从末尾移除 | nums.pop |
| 长度 | nums.length |
| 映射 | nums.map { |n| n * 2 } |
| 筛选 | nums.select { |n| n.even? } |
| 归约 | nums.reduce(0) { |sum, n| sum + n } |
| 排序 | nums.sort |
| 连接成字符串 | nums.join(", ") |
哈希
键值对集合,键通常是符号。
| 操作 | 语法 |
|---|---|
| 创建 | user = { name: "Ada", age: 30 } |
| 取值 | user[:name] |
| 设置值 | user[:email] = "a@x.com" |
| 检查键 | user.key?(:name) |
| 删除键 | user.delete(:age) |
| 所有键 / 值 | user.keys, user.values |
| 遍历 | user.each { |k, v| puts "#{k}: #{v}" } |
| 默认值 | Hash.new(0) |
| 合并 | h1.merge(h2) |
流程控制
条件语句和循环;注意 Ruby 写在语句后面的修饰符。
| 操作 | 语法 |
|---|---|
| if / elsif / else | if x > 0 ... elsif x < 0 ... else ... end |
| 行内 if(修饰符) | puts "hi" if ready |
| unless | unless done ... end |
| 三元运算符 | x > 0 ? "pos" : "neg" |
| case / when | case n; when 1 then ...; else ...; end |
| while 循环 | while i < 10 ... end |
| until 循环 | until done ... end |
| 重复 n 次 | 5.times { |i| puts i } |
| 遍历范围 | (1..5).each { |i| puts i } |
| break / next | break, next |
方法
最后一个表达式的值会被隐式返回。
| 操作 | 语法 |
|---|---|
| 定义方法 | def add(a, b) ... end |
| 隐式返回 | def square(x) x * x end |
| 默认参数 | def greet(name = "World") ... end |
| 关键字参数 | def box(w:, h:) ... end |
| splat(可变参数) | def sum(*nums) ... end |
| 以 ? 结尾的方法 | def valid? ... end |
| 以 ! 结尾的方法 | def normalize! ... end |
| 不加括号调用 | greet "Ada" |
代码块、proc 与 lambda
代码块是传给方法的一段代码;proc 和 lambda 可以把它保存下来。
| 操作 | 语法 |
|---|---|
| 代码块(花括号) | [1, 2].each { |n| puts n } |
| 代码块(do/end) | [1, 2].each do |n| puts n end |
| yield 给代码块 | def run; yield; end |
| 检查是否传入代码块 | block_given? |
| 把代码块捕获为参数 | def run(&blk); blk.call; end |
| 创建 proc | square = proc { |x| x * x } |
| 创建 lambda | square = ->(x) { x * x } |
| 调用 proc / lambda | square.call(3), square.(3) |
类与模块
类保存状态和行为;模块用来混入共享的方法。
| 操作 | 语法 |
|---|---|
| 定义类 | class Point ... end |
| 构造方法 | def initialize(x, y) @x = x; @y = y; end |
| 实例方法 | def dist ... end |
| 访问器简写 | attr_accessor :x, :y |
| 创建实例 | p = Point.new(1, 2) |
| 继承 | class Circle < Shape ... end |
| 类方法 | def self.origin ... end |
| 定义模块 | module Drawable ... end |
| 混入模块 | include Drawable |
| 调用 super | super(args) |
最常用的 Ruby 语法,全都在这一页。这份 Ruby 速查表是核心语言的快速参考:变量和类型、字符串、数组和哈希、流程控制、方法,还有让 Ruby 如此富有表现力的代码块、proc 和 lambda。
这里的内容都是纯 Ruby,可以在任何标准解释器上运行。需要什么就复制什么,也可以在 Ruby 在线编辑器里直接运行每个代码片段,无需安装。
Ruby 速查表常见问题
这份 Ruby 速查表免费吗?
免费。这份 Ruby 速查表完全免费,无需注册。收藏起来,需要查字符串方法、哈希操作或代码块语法时随时回来看。
代码块、proc 和 lambda 有什么区别?
{ ... } 或 do ... end 传给方法的一段匿名代码,它本身不是对象。proc 把代码块包装成一个可调用的对象,可以保存起来、到处传递。lambda 是一种特殊的 proc:它会严格检查参数个数,而且 return 只从 lambda 自身返回;普通的 proc 则会从外层方法返回。Ruby 中的符号是什么?
:name 这样的符号是一个不可变、可复用的标识符。同一个符号在内存中始终指向同一个对象,所以用作哈希键、方法名这类场景时,符号比字符串更快、更省内存。这也是为什么你经常看到哈希写成 { name: "Ada" }。可以在线练习 Ruby 吗?
可以。打开 Ruby 在线编辑器,就能在浏览器里运行这份速查表中的任何代码片段,无需安装 Ruby。想要系统学习的话,Coddy 的免费交互式 Ruby 课程会带你从变量和字符串一步步学到代码块和类。
这份速查表适合初学者吗?
适合。内容从最常用的主题(变量、字符串、流程控制)一直讲到进阶主题(代码块、proc、类),第一天就能用上前面几部分,再慢慢掌握其余内容。