Skip to content

Ruby Cheat Sheet

Helloworld

  • 解释型语言
  • 动态语言
  • 在 Ruby 中,方法名末尾的问号表示这个方法是一个谓词方法,也就是返回布尔值(true 或 false)的方法,即命名约定
ruby
name = "Ruby"
puts "Hello, #{name}!"

运行程序

bash
ruby hello.rb
#=> Hello, Ruby!

字符串操作

TODO

容器(数据结构)

数组(Array)

  • 有序,可以包含任意类型的元素
ruby
arr = [1, 2, 3, "hello", :symbol]
  • 查找元素:include?, index
ruby
# 随机访问
arr[0]
#=> 1

arr.include?(3)
#=> true
  • 添加元素:push 或 <<
ruby
arr = [1, 2, 3, "hello", :symbol]

arr.push(4)
#=> [1, 2, 3, "hello", :symbol, 4]

arr << 6
#=> [1, 2, 3, "hello", :symbol, 4, 6]
  • 删除元素:pop, shift, delete
ruby
arr = [1, 2, 3, "hello", :symbol]
arr.pop
#=> symbol

arr.shift
#=> 1
  • 遍历:each, map, select
ruby
arr.each { |item| puts "Item: #{item}" }

哈希(Hash)

TODO

集合(Set)

TODO

队列(Queue)

TODO

栈(Stack)

TODO

范围对象(Range)

TODO

Enumerator(枚举器)

TODO

方法

  • Ruby 只有方法,没有纯函数,全局方法也是挂在 Object 上
ruby
def sum(a1, a2)
    ret = a1 + a2
    ret
end

result = sum(12, 23)

puts "Sum: #{result}"
  • Ruby 方法只能返回一个对象,但可以通过返回一个数组 + 自动拆包实现“多值返回”
ruby
def bar
    return 1, 2, 3
end

# 自动拆包
a, b, c = bar
#=> 1, 2, 3

# 少接:多余的丢掉
x, y = bar
#=> 1, 2

# 多接:不足的补 nil
x, y, z, w = bar
#=> 1, 2, 3, nil

# * 操作符
x, *y = bar
#=> 1, [2, 3]

流程控制:条件

if-elsif-else

ruby
age = 18
age_description = ""
if age > 18
    age_description = "成年人"
elsif age == 18
    age_description = "刚成年"
else
    age_description = "未成年"
end
  • 三目运算符
ruby
age = 20
age_description = age < 18 ? '未成年' : '成年人'
  • 一行 if
ruby
puts "3. 一行 if"
age = 20
puts "成年人" if age > 18

unless

  • 反向 if
ruby
age = 12
puts "未成年" unless age > 18
#=> 未成年

case/when

ruby
grade = "A+"
case grade
when "A"
    puts "屌毛"
when "B"
    puts "一般货色"
when "C"
    puts "捞"
else
    puts "装逼"
end

流程控制:循环

循环数组

ruby
arr = [23, 1, 2]

# 块写法:单行
arr.each { |item| puts "Item: #{item}" }

# 块写法:多行
arr.each do |item|
    puts "Item: #{item}"
end
  • 带索引
ruby
arr.each_with_index do |item, i| # i 从 0 开始
    puts "Item: #{item}, Index: #{i}"
end

哈希表循环

ruby
table = { age: 12, name: "Luca"}

# 块写法:单行
table.each { |k, v| puts "#{k} => #{v}" }

# 块写法:多行
table.each do |k, v|
    puts "#{k} => #{v}"
end
  • 带索引
ruby
table.each_with_index do |(k, v), i| # i 从 0 开始
    puts "#{k} => #{v}, Index: #{i}"
end
  • 解构参数
ruby
table.each_with_index do |pair, i|
    k, v = pair # 解构
    puts "#{k} => #{v}, Index: #{i}"
end

循环控制关键字:break/next/redo

ruby
(1..5).each do |i|
    break if i == 3
    puts i
end

(1..5).each do |i|
    next if i == 3
    puts i
end

while

ruby
i = 0
while i < 5
  puts i
  i += 1
end

until

  • 反向 while
ruby
i = 0
until i >= 5
  puts i
  i += 1
end

times

ruby
5.times { |i| puts "time 循环第#{i}次" }

upto/downto/step

ruby
1.upto(5) { |i| puts "upto 循环第#{i}次" }

5.downto(0) { |i| puts "upto 循环第#{i}次" }

0.step(10, 2) { |i| puts "step 循环第#{i}次" }

面向对象

  • 万物皆对象:在 Ruby 里,数字、字符串、数组、类本身,全是对象
ruby
class Person
  # 初始化方法,创建对象时会自动调用
  def initialize(name, age)
    @name = name   # 实例变量(属性)
    @age = age
  end

  def say_hi
    puts "大家好,我是 #{@name},今年 #{@age} 岁。"
  end
end

p1 = Person.new("小明", 20)
p1.say_hi
#=> 大家好,我是 小明,今年 20 岁。
  • 继承和多态
ruby
class Animal
  def speak
    puts "我是动物"
  end
end

class Dog < Animal
  def speak
    puts "汪汪!"
  end
end

a = Animal.new
a.speak   # => 我是动物

d = Dog.new
d.speak   # => 汪汪!
  • 封装 + Getter/Setter
ruby
class Car
  def initialize(brand)
    @brand = brand
  end

  # getter
  def brand
    @brand
  end

  # setter
  def brand=(value)
    @brand = value
  end
end

c = Car.new("BMW")
puts c.brand      # => BMW
c.brand = "Tesla"
puts c.brand      # => Tesla
  • Ruby 提供 attr_accessor 简化写法
ruby
class Car
  attr_accessor :brand
  def initialize(brand)
    @brand = brand
  end
end
  • 类方法 & 类变量
ruby
class User
  @@count = 0   # 类变量,所有对象共享

  def initialize(name)
    @name = name
    @@count += 1
  end

  def self.total_users   # 类方法
    @@count
  end
end

u1 = User.new("A")
u2 = User.new("B")

puts User.total_users   # => 2

异常处理

TODO

函数式编程

  • 柯里化
  • 闭包

each/map/select:函数式操作数组

TODO