# Ruby 基础知识

# 进入环境

irb #进入Ruby环境
puts #打印结果
7.class => Fixnum  # 在Ruby裡面,萬物皆有類別。通过`XX.class`查看
  • 字符串
""  # 用双引号创建「字面量字符串」
"foobar" + "bar"  # 字符串连接

# (#{}) 插值操作
first_name = "Michael"
"#{first_name} Hartl" # Michael Hartl

# Ruby 不会对单引号插值
'\n'  # 得到的结果也是 "\\n" 单引号内就是字面量内容,免手动转义
  • 打印字符串
puts "foo"  # 打印后会返回空的字面量
print "foo"  # 不会添加 \n
  • 数组
"foo bar baz".split  # ["foo", "bar", "baz"]

"fooxbarxbazx".split('x')  # 用 x 进行分割

a.first
a.second  # Rails 扩展的
a.last  # synonym 别名系统

a[-1]  # 倒数第一个数

a.sort  # 排序
a.reverse  # 反转
a.shuffle #?

# 如果需要改变数组,那么使用 !(bang)
a.sort!

a.push(6)  # 数组尾部添加数组
a << 7  # 尾部添加
a << "foo" << "bar"  # 串联添加

a.join(',')  # 连接操作

Array 可以直接相加
  • Range

(0..9).to_a  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

a = %w[foo bar baz quux]  # ["foo", "bar", "baz", "quux"]

a[0..2]  # ["foo", "bar", "baz"]

('a'..'e').to_a  # ["a", "b", "c", "d", "e"]
  • block
(1..5).each { |i| puts 2*i }  # 把块传给 each 方法;i 两侧| 用来定义块变量

(1..5).each do |i|  # 块的另一种写法;单行用花括号,多行用 do..end
  puts 2*1
end

3.times { puts "Betelguese!" } # 可以没有变量,执行三次

# 块是一个闭包

# map 返回的是每个元素执行后的结果,数组
(1..5).map { |i| i**2 }  # [1, 4, 9, 16, 25]

# 生成字母表数组,打乱数组,取出前8个元素,合并未字符串
('a'..'z').to_a.shuffle[0..7].join

# Hash 和 Symbol

Hash 本质就是数组,只是索引不局限于使用数字。且没有顺序

user = {} # 创建空 {}

user["first_name"] = "Michael"
.
.
user  # {"last_name"=>"Hartl", "first_name"=>"Michael"}

user = { "first_name" => "Michael", "last_name" => "Hartl"  } # hashrocket 定义方式

# Symbol 像没有约束的字符串,特有的数据类型,很容易比较,Hash 键的最佳选择
# Symbol 中不能使用 '-' 连字符
:name.split('')  # NoMethodError: undefined method `split' for :name:Symbol`

user = { :name => "Michael Hartl", :email => "michael@example.com"  }
user[:name]  # "Michael Hartl"

# Hash 的两种定义句法,等同
h2 = { name: "Michael Hartl", email: "michael@example.com"  }
h1 = { :name => "Michael Hartl", :email => "michael@example.com"  }
h2[:name]  # "Michael Hartl"

# Hash 值可以是任何对象
{:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}

# Hash 有 each 方法,接收两个变量,key & value,以键值对为单位进行遍历
flash = { success: "It worked!", error: "It failed." }
flash.each do |key, value|
  puts "Key #{key.inspect} has value #{value.inspect}"
end

puts (1..5).to_a.inspect  # 输出一个数组字面量形式 [1, 2, 3, 4, 5]

puts :name, :name.inspect # name    :name

p :name  # :name  

# 方法

# 定义方法
def 方法名称(参数)
  方法内容
end

"foobar.length"  # 6 调用方法

"".empty?  # true

nil.to_s.empty?  #消息串联

nil  # 所有对象中,除了 false 本身,唯一一个布尔值为「假」

if 0  # true

# 流程控制

puts "x is not empty" if !x.empty?  # 条件后置
puts "The string '#{string}' is nonempty." unless string.empty?

# Ruby 类

  • 构造器
>> s = "foobar" # 使用涮引号的字面构造器
=> "foobar"
>> s.class
=> String

s.class.superclass  # 查找 String 的父类,基类是 BasicObject

# 别名构造器
s = String.new("foobar")
a = Array.new([1, 3, 2])
h = Hash.new(0)  # 设置不存在的键返回 0

类上调用的方法,如 new 为类方法(class method),实例上调用的方法为 实例方法(instance method)

# 检查单词反转后是否是本身,类中 self 代表对象本身
class Word < String
  def palindrome?
    self == self.reverse  # self 代表这个字符串本身
  end
end
  • 扩充类
# blank < String
>> "".blank?
=> true
>> "      ".empty?
=> false
>> "      ".blank?
=> true
>> nil.blank?
=> true
  • 实例变量
@开头的实例变量,用于类中不同方法之间传递变量。
Rails 中视图可自动获取
未定义则为空

# mass assignment 技术,用 Hash 初始化对象
user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
  • rand(xxx) 产生 xxx位随机数
Last Updated: 5/14/2022, 11:38:45 AM