Ruby 语言入门指南:从零开始探索优雅之道
Ruby 是一种开源的、动态的、面向对象的编程语言,以其优雅的语法和高开发效率而闻名。它由日本人松本行弘(Yukihiro “Matz” Matsumoto)于1990年代中期创建,旨在提供一种既能享受编程乐趣,又能高效工作的语言。如果你正在寻找一种既强大又富有表现力的语言,Ruby 绝对值得一试。
本文将引导你从零开始,逐步掌握 Ruby 编程的基础知识。
1. 为什么选择 Ruby?
- 优雅且富有表现力:Ruby 的语法设计旨在让代码更接近自然语言,易于阅读和编写。
- 面向对象:Ruby 纯粹的面向对象特性意味着一切皆对象,这使得它非常适合构建复杂的、模块化的应用程序。
- 开发效率高:得益于其简洁的语法和强大的内置功能,Ruby 允许开发者以更少的代码完成更多的工作。著名的 Web 框架 Ruby on Rails 就是其高开发效率的典范。
- 庞大的社区和丰富的库:Ruby 拥有一个活跃的全球社区和大量的 Gems(Ruby 库),涵盖了从 Web 开发到数据科学的各种领域。
- 多范式支持:除了面向对象,Ruby 也支持函数式编程和命令式编程。
2. Ruby 环境搭建
在开始编程之前,你需要在你的计算机上安装 Ruby。
步骤 1:安装 Ruby
Windows 用户:
推荐使用 RubyInstaller。访问 rubyinstaller.org 下载最新版本的 RubyInstaller,并按照安装向导的指示进行安装。安装过程中,确保勾选“Add Ruby executables to your PATH”(将 Ruby 可执行文件添加到 PATH 环境变量)。
macOS 用户:
macOS 通常预装了 Ruby,但版本可能较旧。建议使用 rbenv 或 RVM 等版本管理工具来安装和管理多个 Ruby 版本。
- 使用 Homebrew 安装 rbenv:
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install rbenv ruby-build
echo 'eval "$(rbenv init - bash)"' >> ~/.bash_profile # 或者 ~/.zshrc (如果你使用zsh)
source ~/.bash_profile # 或者 source ~/.zshrc - 安装最新 Ruby 版本:
bash
rbenv install 3.2.2 # 安装一个稳定版本,例如 3.2.2
rbenv global 3.2.2 # 设置为全局默认版本
rbenv rehash
Linux 用户:
你可以使用包管理器安装,或者像 macOS 用户一样使用 rbenv 或 RVM。
- Debian/Ubuntu:
sudo apt update && sudo apt install ruby-full - Fedora/CentOS:
sudo dnf install ruby(Fedora) 或sudo yum install ruby(CentOS)
步骤 2:验证安装
打开终端或命令行,输入以下命令:
bash
ruby -v
如果安装成功,你将看到 Ruby 的版本信息,例如 ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]。
3. 第一个 Ruby 程序:Hello World
现在,让我们来编写你的第一个 Ruby 程序。
- 创建一个新文件,命名为
hello.rb。(.rb是 Ruby 文件的标准扩展名)。 -
用文本编辑器打开
hello.rb,输入以下代码:“`ruby
这是一行注释,Ruby 会忽略它
puts “Hello, Ruby World!”
“` -
保存文件。
- 打开终端或命令行,导航到
hello.rb文件所在的目录。 -
运行程序:
bash
ruby hello.rb你将在屏幕上看到输出:
Hello, Ruby World!。
puts是 Ruby 中用于打印输出到控制台的常用方法。
4. Ruby 基础语法
4.1 注释
- 单行注释:以
#开头。 -
多行注释:以
=begin开始,以=end结束。“`ruby
这是一行单行注释
=begin
这是
一个
多行注释
=end
“`
4.2 变量
在 Ruby 中,你不需要声明变量的类型,Ruby 会根据赋给它的值自动推断类型。变量名通常以小写字母开头。
“`ruby
name = “Alice” # 字符串
age = 30 # 整数
price = 99.99 # 浮点数
is_student = true # 布尔值
puts name
puts age
puts price
puts is_student
“`
4.3 数据类型
Ruby 有丰富的数据类型,以下是一些常用的:
- 数字 (Numbers):
- 整数 (Integers):
10,-5,0 - 浮点数 (Floats):
3.14,-0.5,1.0
- 整数 (Integers):
-
字符串 (Strings):用单引号
' '或双引号" "包裹。双引号字符串支持字符串插值(#{})和转义字符。“`ruby
single_quote = ‘Hello’
double_quote = “World”
greeting = “Hello, #{name}!” # 字符串插值puts greeting # 输出:Hello, Alice!
``true
* **布尔值 (Booleans)**:和false。nil` 是一个对象,而不是一个空指针。
* **Nil**:代表“空”或“无值”。在 Ruby 中,
* 数组 (Arrays):有序的、可变的集合,可以包含不同类型的数据。ruby
my_array = [1, "hello", true, 3.14]
puts my_array[0] # 访问第一个元素:1
my_array << "new_item" # 添加元素
puts my_array # 输出:[1, "hello", true, 3.14, "new_item"]
* 哈希 (Hashes):键值对的集合,类似于其他语言中的字典或关联数组。“`ruby
person = { “name” => “Bob”, “age” => 25, “city” => “New York” }Ruby 1.9+ 版本的简写语法,键为符号(Symbol)时更常用
another_person = { name: “Carol”, age: 28 }
puts person[“name”] # 访问值:Bob
puts another_person[:age] # 访问值:28
``:` 开头的字符串字面量。符号是不可变的,在程序运行期间只创建一次。它们常被用作哈希的键。
* **符号 (Symbols)**:以ruby
my_symbol = :my_key
puts my_symbol.class # Symbol
4.4 常量
常量以大写字母开头。约定俗成,常量通常全部大写。
ruby
PI = 3.14159
MAX_USERS = 100
虽然你可以重新赋值常量,但 Ruby 会发出警告,因为这不符合约定。
5. 控制流
5.1 条件语句:if/elsif/else
“`ruby
temperature = 25
if temperature > 30
puts “It’s hot!”
elsif temperature > 20
puts “It’s warm.”
else
puts “It’s cold.”
end
单行 if
puts “You passed!” if score >= 60
“`
5.2 循环
-
while循环:当条件为真时重复执行。ruby
count = 0
while count < 5
puts "Count is: #{count}"
count += 1
end
*until循环:当条件为假时重复执行。ruby
num = 5
until num == 0
puts "Num is: #{num}"
num -= 1
end
*for循环:通常用于遍历范围或集合。“`ruby
for i in 1..3 # 包含 1 和 3
puts “For loop count: #{i}”
endfor item in [“apple”, “banana”]
puts “Fruit: #{item}”
end
``each
* **迭代器**:Ruby 崇尚使用迭代器(例如)而不是传统的for` 循环,这更具 Ruby 风格。“`ruby
遍历数组
[10, 20, 30].each do |number|
puts “Number: #{number}”
end遍历哈希
{a: 1, b: 2}.each do |key, value|
puts “Key: #{key}, Value: #{value}”
end遍历范围
(1..5).each { |i| puts “Iterator count: #{i}” } # 单行块
“`
5.3 case 语句
类似于其他语言的 switch 语句。
“`ruby
day = “Monday”
case day
when “Monday”
puts “Start of the week.”
when “Friday”
puts “Weekend is near!”
else
puts “Just another day.”
end
“`
6. 方法 (Functions)
在 Ruby 中,函数被称为方法。它们用于封装可重用的代码块。
“`ruby
定义一个没有参数的方法
def say_hello
puts “Hello there!”
end
say_hello # 调用方法
定义带参数的方法
def greet(name)
puts “Hello, #{name}!”
end
greet(“Charlie”) # 调用方法,传入参数
定义带默认参数的方法
def add(a, b=0)
a + b # 方法的最后一行是其返回值,可以省略 return 关键字
end
puts add(5, 3) # 输出:8
puts add(10) # 输出:10 (b 使用默认值 0)
可变参数 (Splat operator *)
def sum_all(*numbers)
total = 0
numbers.each do |n|
total += n
end
total
end
puts sum_all(1, 2, 3) # 输出:6
puts sum_all(10, 20, 30, 40) # 输出:100
“`
7. 类和对象 (Classes and Objects)
Ruby 是一种纯粹的面向对象语言,所有值都是对象。你可以定义自己的类来创建对象。
“`ruby
定义一个类
class Dog
# 初始化方法(构造函数)
def initialize(name, breed)
@name = name # 实例变量,属于每个对象
@breed = breed
end
# 读取器方法 (Getter)
def name
@name
end
# 写入器方法 (Setter)
def name=(new_name)
@name = new_name
end
# 另一个方法
def bark
“Woof! My name is #{@name} and I’m a #{@breed}.”
end
# 使用 attr_accessor 自动创建读写器方法
# attr_reader :name, :breed # 只读
# attr_writer :name, :breed # 只写
attr_accessor :age # 创建 age 的读写器方法
end
创建 Dog 类的对象(实例)
my_dog = Dog.new(“Buddy”, “Golden Retriever”)
访问对象的方法和属性
puts my_dog.name # 输出:Buddy
puts my_dog.bark # 输出:Woof! My name is Buddy and I’m a Golden Retriever.
修改属性 (通过 setter 方法)
my_dog.name = “Max”
puts my_dog.name # 输出:Max
my_dog.age = 3 # 使用 attr_accessor 创建的 setter
puts my_dog.age # 使用 attr_accessor 创建的 getter
“`
8. 代码块 (Blocks)、Procs 和 Lambdas
Ruby 的代码块是其最强大的特性之一。代码块是一段没有名称的代码,可以与方法一起传递,用于实现回调或自定义行为。
“`ruby
简单的代码块与 each 方法
[1, 2, 3].each do |num|
puts num * 2
end
或者单行形式
[1, 2, 3].each { |num| puts num * 2 }
自定义方法接收代码块
def execute_block
puts “Before the block.”
yield # 执行传递给方法的代码块
puts “After the block.”
end
execute_block { puts “Hello from the block!” }
带参数的代码块
def execute_block_with_arg(arg)
yield arg
end
execute_block_with_arg(“Ruby”) { |name| puts “This is #{name}.” }
Procs:将代码块封装成对象
my_proc = Proc.new do |name|
puts “Hi, #{name} from a Proc.”
end
my_proc.call(“Emily”)
Lambdas:Procs 的一种特殊形式,对参数和返回值有更严格的要求
my_lambda = lambda do |name|
if name.nil?
return “Name cannot be nil!” # lambda 的 return 只会跳出 lambda
end
“Greetings, #{name} from a Lambda.”
end
puts my_lambda.call(“Frank”)
puts my_lambda.call(nil) # 会执行 nil 分支并返回 “Name cannot be nil!”
对比 Proc 和 Lambda 的行为:
– 参数检查:Lambda 会检查参数数量,Proc 不会。
– return 行为:Lambda 的 return 只跳出 Lambda 本身,Proc 的 return 会跳出定义它的方法。
“`
9. 模块 (Modules) 和 Mixins
模块在 Ruby 中有两个主要用途:
- 作为命名空间:组织相关的方法、类和常量,避免命名冲突。
- 作为 Mixins:通过
include或extend将模块的功能混合到类中,实现多重继承的效果(Ruby 不支持多重继承,但通过 Mixins 弥补)。
“`ruby
模块作为命名空间
module MyUtilities
PI = 3.14159
def self.say_something # 模块方法
puts “This is from MyUtilities.”
end
class Helper
def info
“I am a helper class in MyUtilities.”
end
end
end
puts MyUtilities::PI
MyUtilities.say_something
helper = MyUtilities::Helper.new
puts helper.info
模块作为 Mixin
module Greetable
def greet
“Hello, I am #{name}!”
end
end
class Person
include Greetable # 包含模块,使其方法成为实例方法
attr_accessor :name
def initialize(name)
@name = name
end
end
class Robot
include Greetable
attr_accessor :name
def initialize(name)
@name = name
end
end
person = Person.new(“David”)
puts person.greet # Person 实例现在有了 greet 方法
robot = Robot.new(“Unit-734”)
puts robot.greet # Robot 实例也有了 greet 方法
“`
10. Gem 管理
Ruby Gems 是 Ruby 的包管理系统,类似于 Python 的 pip 或 Node.js 的 npm。你可以使用 gem 命令来安装、管理和发布库。
- 查找 Gem:
gem search <gem_name> - 安装 Gem:
gem install <gem_name>(例如:gem install rails) - 卸载 Gem:
gem uninstall <gem_name> - 列出已安装的 Gem:
gem list
通常,在项目中我们会使用 Bundler 来管理项目的依赖。在一个 Ruby 项目的根目录下,会有一个 Gemfile 文件,列出了项目所需的所有 Gem。
Gemfile 示例:
“`ruby
source “https://rubygems.org”
gem “rails”, “~> 7.0.0”
gem “pg”
gem “puma”
gem “rspec-rails”
“`
使用 Bundler:
- 在项目目录下创建一个
Gemfile文件。 - 在终端中运行
bundle install,Bundler 会读取Gemfile并安装所有依赖到项目目录或系统。 - 要运行依赖于 Gemfile 的程序,使用
bundle exec:bundle exec ruby my_script.rb
11. 接下来去哪里?
恭喜你,你已经掌握了 Ruby 的基础知识!但这仅仅是个开始。
- Ruby on Rails:如果你对 Web 开发感兴趣,Ruby on Rails 是一个功能强大且高效的框架。
- 更多实践:尝试解决一些编程挑战,例如 LeetCode 或 HackerRank 上的 Ruby 题目。
- 阅读 Ruby 文档:官方文档是学习新特性和深入理解语言的最佳资源。
- 探索 Gem:RubyGems.org 上有数不尽的 Gems 可以扩展 Ruby 的功能。
- 社区参与:加入 Ruby 社区论坛或聊天组,与其他开发者交流学习。
Ruby 语言以其简洁、强大和灵活的特性,将带给你愉悦的编程体验。祝你在 Ruby 的世界中旅途愉快!
—Got it. The user wants an article about learning Ruby. I’ll write a comprehensive guide covering the basics.Okay, I understand. I will write a detailed introductory guide to the Ruby programming language.Ruby 语言入门指南:从零开始探索优雅之道
Ruby 是一种开源的、动态的、面向对象的编程语言,以其优雅的语法和高开发效率而闻名。它由日本人松本行弘(Yukihiro “Matz” Matsumoto)于1990年代中期创建,旨在提供一种既能享受编程乐趣,又能高效工作的语言。如果你正在寻找一种既强大又富有表现力的语言,Ruby 绝对值得一试。
本文将引导你从零开始,逐步掌握 Ruby 编程的基础知识。
1. 为什么选择 Ruby?
- 优雅且富有表现力:Ruby 的语法设计旨在让代码更接近自然语言,易于阅读和编写。
- 纯粹的面向对象:在 Ruby 中,一切皆对象。这意味着即使是数字和
nil都是对象,这使得它非常适合构建复杂的、模块化的应用程序。 - 开发效率高:得益于其简洁的语法和强大的内置功能,Ruby 允许开发者以更少的代码完成更多的工作。著名的 Web 框架 Ruby on Rails 就是其高开发效率的典范。
- 庞大的社区和丰富的库:Ruby 拥有一个活跃的全球社区和大量的 Gems(Ruby 库),涵盖了从 Web 开发到数据科学的各种领域。
- 多范式支持:除了面向对象,Ruby 也支持函数式编程和命令式编程。
2. Ruby 环境搭建
在开始编程之前,你需要在你的计算机上安装 Ruby。
步骤 1:安装 Ruby
Windows 用户:
推荐使用 RubyInstaller。访问 rubyinstaller.org 下载最新版本的 RubyInstaller,并按照安装向导的指示进行安装。安装过程中,确保勾选“Add Ruby executables to your PATH”(将 Ruby 可执行文件添加到 PATH 环境变量)。
macOS 用户:
macOS 通常预装了 Ruby,但版本可能较旧。建议使用 rbenv 或 RVM 等版本管理工具来安装和管理多个 Ruby 版本。这里以 rbenv 为例:
- 使用 Homebrew 安装 rbenv:
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install rbenv ruby-build
echo 'eval "$(rbenv init - bash)"' >> ~/.bash_profile # 或者 ~/.zshrc (如果你使用zsh)
source ~/.bash_profile # 或者 source ~/.zshrc - 安装最新稳定 Ruby 版本:
bash
rbenv install 3.2.2 # 安装一个稳定版本,例如 3.2.2,你可以选择更新的版本
rbenv global 3.2.2 # 设置为全局默认版本
rbenv rehash
Linux 用户:
你可以使用包管理器安装,或者像 macOS 用户一样使用 rbenv 或 RVM。
- Debian/Ubuntu:
sudo apt update && sudo apt install ruby-full - Fedora/CentOS:
sudo dnf install ruby(Fedora) 或sudo yum install ruby(CentOS)
步骤 2:验证安装
打开终端或命令行,输入以下命令:
bash
ruby -v
如果安装成功,你将看到 Ruby 的版本信息,例如 ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]。
3. 第一个 Ruby 程序:Hello World
现在,让我们来编写你的第一个 Ruby 程序。
- 创建一个新文件,命名为
hello.rb。(.rb是 Ruby 文件的标准扩展名)。 -
用文本编辑器打开
hello.rb,输入以下代码:“`ruby
这是一行注释,Ruby 解释器会忽略它
puts “Hello, Ruby World!”
“` -
保存文件。
- 打开终端或命令行,导航到
hello.rb文件所在的目录。 -
运行程序:
bash
ruby hello.rb你将在屏幕上看到输出:
Hello, Ruby World!。
puts是 Ruby 中用于打印输出到控制台的常用方法。
4. Ruby 基础语法
4.1 注释
- 单行注释:以
#开头。 -
多行注释:以
=begin开始,以=end结束。“`ruby
这是一行单行注释
=begin
这是
一个
多行注释示例
=end
“`
4.2 变量
在 Ruby 中,你不需要声明变量的类型,Ruby 会根据赋给它的值自动推断类型。变量名通常以小写字母开头。
“`ruby
name = “Alice” # 字符串
age = 30 # 整数
price = 99.99 # 浮点数
is_student = true # 布尔值
puts name
puts age
puts price
puts is_student
“`
4.3 数据类型
Ruby 有丰富的数据类型,以下是一些常用的:
- 数字 (Numbers):
- 整数 (Integers):
10,-5,0 - 浮点数 (Floats):
3.14,-0.5,1.0
- 整数 (Integers):
-
字符串 (Strings):用单引号
' '或双引号" "包裹。双引号字符串支持字符串插值(#{})和转义字符。“`ruby
single_quote = ‘Hello’
double_quote = “World”
my_name = “Bob”
greeting = “Hello, #{my_name}!” # 字符串插值puts greeting # 输出:Hello, Bob!
``true
* **布尔值 (Booleans)**:和false。除了false和nil,所有其他值在 Ruby 中都视为“真”。nil` 是一个对象,而不是一个空指针。
* **Nil**:代表“空”或“无值”。在 Ruby 中,
* 数组 (Arrays):有序的、可变的集合,可以包含不同类型的数据。ruby
my_array = [1, "hello", true, 3.14]
puts my_array[0] # 访问第一个元素:1
my_array << "new_item" # 添加元素
puts my_array.inspect # 输出:[1, "hello", true, 3.14, "new_item"]
* 哈希 (Hashes):键值对的集合,类似于其他语言中的字典或关联数组。“`ruby
person = { “name” => “Bob”, “age” => 25, “city” => “New York” }Ruby 1.9+ 版本的简写语法,键为符号(Symbol)时更常用
another_person = { name: “Carol”, age: 28 }
puts person[“name”] # 访问值:Bob
puts another_person[:age] # 访问值:28
``:` 开头的字符串字面量。符号是不可变的,在程序运行期间只创建一次。它们常被用作哈希的键,因为效率更高。
* **符号 (Symbols)**:以ruby
my_symbol = :my_key
puts my_symbol.class # Symbol
4.4 常量
常量以大写字母开头。约定俗成,常量通常全部大写。
ruby
PI = 3.14159
MAX_USERS = 100
虽然你可以重新赋值常量,但 Ruby 会发出警告,因为这不符合约定。
5. 控制流
5.1 条件语句:if/elsif/else
“`ruby
temperature = 25
if temperature > 30
puts “It’s hot!”
elsif temperature > 20
puts “It’s warm.”
else
puts “It’s cold.”
end
单行 if
score = 70
puts “You passed!” if score >= 60
“`
5.2 循环
-
while循环:当条件为真时重复执行。ruby
count = 0
while count < 3
puts "Count is: #{count}"
count += 1
end
*until循环:当条件为假时重复执行。ruby
num = 3
until num == 0
puts "Num is: #{num}"
num -= 1
end
*for循环:通常用于遍历范围或集合。“`ruby
for i in 1..3 # 包含 1 和 3
puts “For loop count: #{i}”
endfor item in [“apple”, “banana”]
puts “Fruit: #{item}”
end
``each
* **迭代器**:Ruby 崇尚使用迭代器(例如、map、select等)而不是传统的for` 循环,这更具 Ruby 风格和表达力。“`ruby
遍历数组
[10, 20, 30].each do |number|
puts “Number: #{number}”
end遍历哈希
{a: 1, b: 2}.each do |key, value|
puts “Key: #{key}, Value: #{value}”
end遍历范围
(1..3).each { |i| puts “Iterator count: #{i}” } # 单行块
“`
5.3 case 语句
类似于其他语言的 switch 语句。
“`ruby
day = “Monday”
case day
when “Monday”
puts “Start of the week.”
when “Friday”
puts “Weekend is near!”
else
puts “Just another day.”
end
“`
6. 方法 (Functions)
在 Ruby 中,函数被称为方法。它们用于封装可重用的代码块。
“`ruby
定义一个没有参数的方法
def say_hello
puts “Hello there!”
end
say_hello # 调用方法
定义带参数的方法
def greet(name)
puts “Hello, #{name}!”
end
greet(“Charlie”) # 调用方法,传入参数
定义带默认参数的方法
def add(a, b = 0)
a + b # 方法的最后一行是其返回值,可以省略 return 关键字
end
puts add(5, 3) # 输出:8
puts add(10) # 输出:10 (b 使用默认值 0)
可变参数 (Splat operator *)
def sum_all(*numbers)
total = 0
numbers.each do |n|
total += n
end
total
end
puts sum_all(1, 2, 3) # 输出:6
puts sum_all(10, 20, 30, 40) # 输出:100
“`
7. 类和对象 (Classes and Objects)
Ruby 是一种纯粹的面向对象语言,所有值都是对象。你可以定义自己的类来创建对象。
“`ruby
定义一个类
class Dog
# 初始化方法(构造函数)
def initialize(name, breed)
@name = name # 实例变量,以 ‘@’ 开头,属于每个对象
@breed = breed
end
# 读取器方法 (Getter)
def name
@name
end
# 写入器方法 (Setter)
def name=(new_name)
@name = new_name
end
# 另一个方法
def bark
“Woof! My name is #{@name} and I’m a #{@breed}.”
end
# 使用 attr_accessor 自动创建读写器方法(推荐)
# attr_reader :name, :breed # 只读
# attr_writer :name, :breed # 只写
attr_accessor :age # 为 age 属性自动创建读取和写入方法
end
创建 Dog 类的对象(实例)
my_dog = Dog.new(“Buddy”, “Golden Retriever”)
访问对象的方法和属性
puts my_dog.name # 输出:Buddy
puts my_dog.bark # 输出:Woof! My name is Buddy and I’m a Golden Retriever.
修改属性 (通过 setter 方法)
my_dog.name = “Max”
puts my_dog.name # 输出:Max
my_dog.age = 3 # 使用 attr_accessor 创建的 setter
puts my_dog.age # 使用 attr_accessor 创建的 getter
“`
8. 代码块 (Blocks)、Procs 和 Lambdas
Ruby 的代码块是其最强大的特性之一。代码块是一段没有名称的代码,可以与方法一起传递,用于实现回调或自定义行为。
“`ruby
简单的代码块与 each 方法
[1, 2, 3].each do |num|
puts num * 2
end
或者单行形式
[1, 2, 3].each { |num| puts num * 2 }
自定义方法接收代码块
def execute_block
puts “Before the block.”
yield # 执行传递给方法的代码块
puts “After the block.”
end
execute_block { puts “Hello from the block!” }
带参数的代码块
def execute_block_with_arg(arg)
yield arg
end
execute_block_with_arg(“Ruby”) { |name| puts “This is #{name}.” }
Procs:将代码块封装成对象
my_proc = Proc.new do |name|
puts “Hi, #{name} from a Proc.”
end
my_proc.call(“Emily”)
Lambdas:Procs 的一种特殊形式,对参数和返回值有更严格的要求
my_lambda = lambda do |name|
# Lambda 会检查参数数量,如果参数数量不匹配会抛出异常
# Lambda 的 return 只会跳出 Lambda 本身
“Greetings, #{name} from a Lambda.”
end
puts my_lambda.call(“Frank”)
puts my_lambda.call # 会抛出 ArgumentError (wrong number of arguments)
“`
9. 模块 (Modules) 和 Mixins
模块在 Ruby 中有两个主要用途:
- 作为命名空间:组织相关的方法、类和常量,避免命名冲突。
- 作为 Mixins:通过
include或extend将模块的功能混合到类中,实现多重继承的效果(Ruby 不支持多重继承,但通过 Mixins 弥补)。
“`ruby
模块作为命名空间
module MyUtilities
PI = 3.14159
def self.say_something # 模块方法(可以直接通过模块名调用)
puts “This is from MyUtilities.”
end
class Helper
def info
“I am a helper class in MyUtilities.”
end
end
end
puts MyUtilities::PI
MyUtilities.say_something
helper = MyUtilities::Helper.new
puts helper.info
模块作为 Mixin
module Greetable
def greet
“Hello, I am #{name}!”
end
end
class Person
include Greetable # 包含模块,使其方法成为实例方法
attr_accessor :name
def initialize(name)
@name = name
end
end
class Robot
include Greetable
attr_accessor :name
def initialize(name)
@name = name
end
end
person = Person.new(“David”)
puts person.greet # Person 实例现在有了 greet 方法
robot = Robot.new(“Unit-734”)
puts robot.greet # Robot 实例也有了 greet 方法
“`
10. Gem 管理
Ruby Gems 是 Ruby 的包管理系统,类似于 Python 的 pip 或 Node.js 的 npm。你可以使用 gem 命令来安装、管理和发布库。
- 查找 Gem:
gem search <gem_name> - 安装 Gem:
gem install <gem_name>(例如:gem install rails) - 卸载 Gem:
gem uninstall <gem_name> - 列出已安装的 Gem:
gem list
通常,在项目中我们会使用 Bundler 来管理项目的依赖。在一个 Ruby 项目的根目录下,会有一个 Gemfile 文件,列出了项目所需的所有 Gem。
Gemfile 示例:
“`ruby
source “https://rubygems.org”
gem “rails”, “~> 7.0.0”
gem “pg”
gem “puma”
group :development, :test do
gem “rspec-rails”
end
“`
使用 Bundler:
- 在项目目录下创建一个
Gemfile文件。 - 在终端中运行
bundle install,Bundler 会读取Gemfile并安装所有依赖到项目目录或系统。 - 要运行依赖于 Gemfile 的程序,使用
bundle exec:bundle exec ruby my_script.rb
11. 接下来去哪里?
恭喜你,你已经掌握了 Ruby 的基础知识!但这仅仅是个开始。
- Ruby on Rails:如果你对 Web 开发感兴趣,Ruby on Rails 是一个功能强大且高效的框架。
- 更多实践:尝试解决一些编程挑战,例如 LeetCode 或 HackerRank 上的 Ruby 题目。
- 阅读 Ruby 文档:官方文档是学习新特性和深入理解语言的最佳资源。
- 探索 Gem:RubyGems.org 上有数不尽的 Gems 可以扩展 Ruby 的功能。
- 社区参与:加入 Ruby 社区论坛或聊天组,与其他开发者交流学习。
Ruby 语言以其简洁、强大和灵活的特性,将带给你愉悦的编程体验。祝你在 Ruby 的世界中旅途愉快!