Ruby 语言入门指南 – wiki大全


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,但版本可能较旧。建议使用 rbenvRVM 等版本管理工具来安装和管理多个 Ruby 版本。

  1. 使用 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
  2. 安装最新 Ruby 版本:
    bash
    rbenv install 3.2.2 # 安装一个稳定版本,例如 3.2.2
    rbenv global 3.2.2 # 设置为全局默认版本
    rbenv rehash

Linux 用户:
你可以使用包管理器安装,或者像 macOS 用户一样使用 rbenvRVM

  • 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 程序。

  1. 创建一个新文件,命名为 hello.rb。(.rb 是 Ruby 文件的标准扩展名)。
  2. 用文本编辑器打开 hello.rb,输入以下代码:

    “`ruby

    这是一行注释,Ruby 会忽略它

    puts “Hello, Ruby World!”
    “`

  3. 保存文件。

  4. 打开终端或命令行,导航到 hello.rb 文件所在的目录。
  5. 运行程序:

    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
  • 字符串 (Strings):用单引号 ' ' 或双引号 " " 包裹。双引号字符串支持字符串插值(#{})和转义字符。

    “`ruby
    single_quote = ‘Hello’
    double_quote = “World”
    greeting = “Hello, #{name}!” # 字符串插值

    puts greeting # 输出:Hello, Alice!
    ``
    * **布尔值 (Booleans)**:
    truefalse
    * **Nil**:代表“空”或“无值”。在 Ruby 中,
    nil` 是一个对象,而不是一个空指针。
    * 数组 (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}”
    end

    for item in [“apple”, “banana”]
    puts “Fruit: #{item}”
    end
    ``
    * **迭代器**:Ruby 崇尚使用迭代器(例如
    each)而不是传统的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 中有两个主要用途:

  1. 作为命名空间:组织相关的方法、类和常量,避免命名冲突。
  2. 作为 Mixins:通过 includeextend 将模块的功能混合到类中,实现多重继承的效果(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 命令来安装、管理和发布库。

  • 查找 Gemgem search <gem_name>
  • 安装 Gemgem install <gem_name> (例如:gem install rails)
  • 卸载 Gemgem uninstall <gem_name>
  • 列出已安装的 Gemgem list

通常,在项目中我们会使用 Bundler 来管理项目的依赖。在一个 Ruby 项目的根目录下,会有一个 Gemfile 文件,列出了项目所需的所有 Gem。

Gemfile 示例:

“`ruby
source “https://rubygems.org”

gem “rails”, “~> 7.0.0”
gem “pg”
gem “puma”
gem “rspec-rails”
“`

使用 Bundler:

  1. 在项目目录下创建一个 Gemfile 文件。
  2. 在终端中运行 bundle install,Bundler 会读取 Gemfile 并安装所有依赖到项目目录或系统。
  3. 要运行依赖于 Gemfile 的程序,使用 bundle execbundle 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,但版本可能较旧。建议使用 rbenvRVM 等版本管理工具来安装和管理多个 Ruby 版本。这里以 rbenv 为例:

  1. 使用 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
  2. 安装最新稳定 Ruby 版本:
    bash
    rbenv install 3.2.2 # 安装一个稳定版本,例如 3.2.2,你可以选择更新的版本
    rbenv global 3.2.2 # 设置为全局默认版本
    rbenv rehash

Linux 用户:
你可以使用包管理器安装,或者像 macOS 用户一样使用 rbenvRVM

  • 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 程序。

  1. 创建一个新文件,命名为 hello.rb。(.rb 是 Ruby 文件的标准扩展名)。
  2. 用文本编辑器打开 hello.rb,输入以下代码:

    “`ruby

    这是一行注释,Ruby 解释器会忽略它

    puts “Hello, Ruby World!”
    “`

  3. 保存文件。

  4. 打开终端或命令行,导航到 hello.rb 文件所在的目录。
  5. 运行程序:

    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
  • 字符串 (Strings):用单引号 ' ' 或双引号 " " 包裹。双引号字符串支持字符串插值(#{})和转义字符。

    “`ruby
    single_quote = ‘Hello’
    double_quote = “World”
    my_name = “Bob”
    greeting = “Hello, #{my_name}!” # 字符串插值

    puts greeting # 输出:Hello, Bob!
    ``
    * **布尔值 (Booleans)**:
    truefalse。除了falsenil,所有其他值在 Ruby 中都视为“真”。
    * **Nil**:代表“空”或“无值”。在 Ruby 中,
    nil` 是一个对象,而不是一个空指针。
    * 数组 (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}”
    end

    for item in [“apple”, “banana”]
    puts “Fruit: #{item}”
    end
    ``
    * **迭代器**:Ruby 崇尚使用迭代器(例如
    eachmapselect等)而不是传统的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 中有两个主要用途:

  1. 作为命名空间:组织相关的方法、类和常量,避免命名冲突。
  2. 作为 Mixins:通过 includeextend 将模块的功能混合到类中,实现多重继承的效果(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 命令来安装、管理和发布库。

  • 查找 Gemgem search <gem_name>
  • 安装 Gemgem install <gem_name> (例如:gem install rails)
  • 卸载 Gemgem uninstall <gem_name>
  • 列出已安装的 Gemgem 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:

  1. 在项目目录下创建一个 Gemfile 文件。
  2. 在终端中运行 bundle install,Bundler 会读取 Gemfile 并安装所有依赖到项目目录或系统。
  3. 要运行依赖于 Gemfile 的程序,使用 bundle execbundle 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 的世界中旅途愉快!


滚动至顶部