Menu
CoddyTech

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 / elseif x > 0 ... elsif x < 0 ... else ... end
行内 if(修饰符)puts "hi" if ready
unlessunless done ... end
三元运算符x > 0 ? "pos" : "neg"
case / whencase 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 / nextbreak, 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
创建 procsquare = proc { |x| x * x }
创建 lambdasquare = ->(x) { x * x }
调用 proc / lambdasquare.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
调用 supersuper(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、类),第一天就能用上前面几部分,再慢慢掌握其余内容。

Coddy 编程语言插图

在 Coddy 学习 Ruby

开始