Appearance
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 > 18unless
- 反向 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
endwhile
ruby
i = 0
while i < 5
puts i
i += 1
enduntil
- 反向 while
ruby
i = 0
until i >= 5
puts i
i += 1
endtimes
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