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}" 9endHash: 键值对集合。
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 框架能够显著提高开发效率和维护性。持续学习和实践,将能更好地掌握这门语言的精髓。