Ruby 语言学习笔记:从入门到实践
10 minute read

Ruby 是一种优雅、简洁且富有表现力的面向对象编程语言。它以其“程序员友好”的设计理念而闻名,使得开发者能够专注于解决问题,而不是被复杂的语法所困扰。无论是构建 Web 应用(如 Ruby on Rails),还是进行脚本编写,Ruby 都是一个优秀的选择。本文将作为一份学习笔记,梳理 Ruby 的核心概念和一些实用技巧,旨在帮助初学者快速入门,并为有经验的开发者提供参考,尤其是在开发涉及到动态内容管理或用户交互的平台(如世界杯投注网站)时,Ruby 的灵活性会带来很大便利。

1. Ruby 的基本语法与特性

  • 一切皆对象: Ruby 中,数字、字符串、甚至 nil 都是对象。这意味着你可以对任何东西调用方法。

    1puts 5.class     # 输出: Integer
    2puts "Hello".class # 输出: String
    3puts nil.class   # 输出: NilClass
    
  • 简洁的语法: Ruby 鼓励使用简洁的语法。例如,方法的调用可以省略括号,if 语句可以写在行尾。

    1def greet(name)
    2  "Hello, #{name}!"
    3end
    4
    5puts greet("World") # 输出: Hello, World!
    6puts greet "Alice"  # 同样有效
    7
    8x = 10
    9puts "x is positive" if x > 0
    
  • 注释: Ruby 使用 # 进行单行注释。

    1# 这是一个注释
    
  • 变量: Ruby 区分不同作用域的变量,通常以首字母区分:

    • local_variable: 局部变量,以小写字母或下划线开头。
    • @@class_variable: 类变量,在类的所有实例之间共享,以 @@ 开头。
    • @instance_variable: 实例变量,属于特定对象,以 @ 开头。
    • $global_variable: 全局变量,以 $ 开头(不推荐使用)。
    • CONSTANT: 常量,以大写字母开头,一旦赋值后不应被修改。

2. 方法(Methods)

方法是 Ruby 中组织代码的基本单元。

  • 定义方法: 使用 def 关键字。

    1def add(a, b)
    2  a + b
    3end
    4
    5puts add(3, 5) # 输出: 8
    
  • 返回值: Ruby 方法的返回值是最后一条表达式的值,无需 return 关键字(但可以显式使用)。

    1def multiply(a, b)
    2  result = a * b
    3  return result # 显式返回
    4  # 或者直接写 result
    5end
    
  • 参数: Ruby 方法支持默认参数值、可变参数 (*args) 和关键字参数。

     1def say_hello(name = "Guest")
     2  puts "Hello, #{name}"
     3end
     4say_hello # 输出: Hello, Guest
     5say_hello("Bob") # 输出: Hello, Bob
     6
     7def sum_all(*numbers)
     8  numbers.reduce(0, :+) # reduce 是一个非常有用的方法
     9end
    10puts sum_all(1, 2, 3, 4) # 输出: 10
    

3. 控制流

  • 条件语句: if, unless, elsif, else, case

     1score = 85
     2if score >= 90
     3  puts "优秀"
     4elsif score >= 80
     5  puts "良好"
     6else
     7  puts "及格"
     8end
     9
    10# unless 相当于 if not
    11puts "x is not zero" unless x == 0
    12
    13# case 语句
    14day = "Monday"
    15case day
    16when "Saturday", "Sunday"
    17  puts "周末愉快!"
    18when "Monday"
    19  puts "新的一周开始了。"
    20else
    21  puts "工作日。"
    22end
    
  • 循环: while, until, for, loop, each (通常通过迭代器实现)。

     1# while
     2i = 0
     3while i < 5
     4  puts i
     5  i += 1
     6end
     7
     8# loop (需要 break 退出)
     9i = 0
    10loop do
    11  puts i
    12  i += 1
    13  break if i > 3
    14end
    
# each (非常常用,通常与 Range 结合)
(1..5).each do |num|
  puts num
end
```

4. 集合(Collections)

Ruby 提供了强大的集合类,如 Array(数组)和 Hash(哈希表)。

  • Array:

    1fruits = ["apple", "banana", "cherry"]
    2puts fruits[0]     # 输出: apple
    3fruits << "date"   # 添加元素
    4fruits.push("elderberry") # 另一种添加方式
    5puts fruits.length # 输出: 5
    6
    7fruits.each_with_index do |fruit, index|
    8  puts "#{index}: #{fruit}"
    9end
    
  • Hash: 键值对集合。

     1person = { name: "Alice", age: 30, city: "New York" }
     2puts person[:name] # 输出: Alice
     3
     4# 另一种创建方式 (Symbol 作为键)
     5student = Hash.new # 创建一个空 Hash
     6student[:id] = 101
     7student.store(:name, "Bob") # store 方法
     8
     9puts student # 输出: {:id=>101, :name=>"Bob"}
    10
    11person.each do |key, value|
    12  puts "#{key}: #{value}"
    13end
    

5. 类(Classes)和对象(Objects)

Ruby 是纯粹的面向对象语言。

  • 定义类:

     1class Dog
     2  # 类变量
     3  @@dog_count = 0
     4
     5  # 初始化方法 (构造函数)
     6  def initialize(name, breed)
     7    @name = name # 实例变量
     8    @breed = breed
     9    @@dog_count += 1
    10  end
    11
    12  # 实例方法
    13  def bark
    14    puts "#{@name} says Woof!"
    15  end
    16
    17  def display_breed
    18    puts "#{@name} is a #{@breed}"
    19  end
    20
    21  # 类方法 (通过 self 调用)
    22  def self.total_dogs
    23    @@dog_count
    24  end
    25end
    
  • 创建对象:

    1my_dog = Dog.new("Buddy", "Golden Retriever")
    2your_dog = Dog.new("Lucy", "Poodle")
    3
    4my_dog.bark
    5my_dog.display_breed
    6your_dog.bark
    
  • 访问器方法 (Getters and Setters): 可以通过 attr_reader, attr_writer, attr_accessor 简化实例变量的访问。

     1class Cat
     2  attr_accessor :name, :color # 同时定义 getter 和 setter
     3
     4  def initialize(name, color)
     5    @name = name
     6    @color = color
     7  end
     8
     9  def meow
    10    puts "#{@name} says Meow! I am #{@color}."
    11  end
    12end
    
my_cat = Cat.new("Whiskers", "black")
puts my_cat.name   # 使用 attr_accessor 定义的 getter
my_cat.color = "white" # 使用 attr_accessor 定义的 setter
my_cat.meow
```

6. 模块(Modules)和 Mixin

模块用于组织代码和实现 Mixin(混入),以实现代码重用和多重继承的效果。

  • 定义模块:
     1module Speak
     2  def speak(sound)
     3    puts "#{self.name} says #{sound}"
     4  end
     5end
     6
     7class Person
     8  include Speak # 混入 Speak 模块
     9  attr_reader :name
    10
    11  def initialize(name)
    12    @name = name
    13  end
    14end
    15
    16person = Person.new("John")
    17person.speak("Hello") # 输出: John says Hello
    

7. 块(Blocks)、迭代器(Iterators)和 Proc/Lambda

块是 Ruby 中一个非常强大且独特的概念,它允许将代码片段传递给方法。

  • 块(Blocks): 块通常与迭代器(如 each, map, select)一起使用,可以看作是匿名函数。

    1[1, 2, 3].each do |n|
    2  puts n * 2
    3end
    4# 输出:
    5# 2
    6# 4
    7# 6
    

    也可以使用 {} 来定义单行块:

    1[1, 2, 3].each { |n| puts n * 2 }
    
  • Proc: 块的一种对象化表示。

    1my_proc = Proc.new { |name| puts "Hello, #{name}" }
    2my_proc.call("Ruby") # 输出: Hello, Ruby
    3
    4# 也可以用Proc.new创建,或者直接用 Proc.new
    5say_hi = proc { |name| puts "Hi, #{name}" }
    6say_hi.call("World")
    
  • Lambda: 与 Proc 类似,但行为上有一些关键区别(如参数检查、返回行为)。Lambda 更接近其他语言的匿名函数。

     1my_lambda = lambda { |name| puts "Lambda says Hi, #{name}" }
     2my_lambda.call("User") # 输出: Lambda says Hi, User
     3
     4# lambda 参数数量固定,多余或不足会报错
     5# proc 参数数量不固定,多余的会被忽略,不足的会是 nil
     6
     7# lambda 的 return 会退出 lambda 自身,而 proc 的 return 会退出调用它的方法
     8def method_with_proc
     9  proc { return "proc return" }.call
    10  "method return"
    11end
    12puts method_with_proc # 输出: proc return
    13
    14def method_with_lambda
    15  lambda { return "lambda return" }.call
    16  "method return"
    17end
    18puts method_with_lambda # 输出: method return
    

8. Gem 包管理

Ruby 的包管理器是 Gem。你可以使用 gem 命令安装、卸载和管理库。

  • 安装 Gem:
    1gem install rails # 安装 Ruby on Rails 框架
    2gem install nokogiri # 安装一个用于解析 HTML/XML 的库
    
  • 查看已安装 Gem:
    1gem list
    

9. Ruby on Rails

Ruby on Rails(简称 Rails)是一个非常流行的 Web 应用框架,它遵循 MVC(Model-View-Controller)架构模式,并大量使用 Ruby 的特性。Rails 极大地简化了 Web 开发的流程,鼓励“约定优于配置”的原则。

总结

Ruby 语言的优雅和强大,使其成为开发各种应用的理想选择。从基础的语法到面向对象的特性,再到块和模块等高级概念,Ruby 都提供了清晰且富有表现力的方式。对于需要快速开发、灵活迭代的项目,如世界杯投注相关的在线服务,Ruby 和 Rails 框架能够显著提高开发效率和维护性。持续学习和实践,将能更好地掌握这门语言的精髓。