Ruby 学习笔记

20分钟体验 Ruby | Ruby 官方网站

安装

macOS:

brew install ruby

Ubuntu:

sudo apt install ruby

包管理器

Gem 是 Ruby 的包管理工具,类似于 Python 的 pip 或者 JavaScript 的 npm。

基本命令

gem install <gem_name>    # 安装 Gem 包
gem list                  # 列出已安装的 Gem 包
gem search <gem_name>     # 搜索 Gem 包
gem update <gem_name>     # 更新 Gem 包
gem uninstall <gem_name>  # 卸载 Gem 包
gem info <gem_name>       # 查看 Gem 包信息

查看 Gem 包文档:

gem server

运行此命令后,打开浏览器并访问 http://localhost:8808 ,可以查看本地已安装 Gem 包的文档。

Bundler

在实际项目中,通常使用 Bundler 来管理 Gem 依赖。Bundler 使用 Gemfile 文件来定义项目所需的 Gem 及其版本。

安装 Bundler:

gem install bundler

在项目根目录下创建一个名为 Gemfile 的文件,内容如下:

source 'https://rubygems.org'

gem 'rails', '~> 6.1.0'
gem 'pg', '>= 0.18', '< 2.0'

安装 Gemfile 中指定的 Gem:

bundle install

更新 Gemfile 中指定的 Gem:

bundle update

版本管理器

Ruby 的主流版本管理器有 RVM 和 rbenv。我还没有遇到需要使用版本管理器的情况,因此这里留空。

基本语法

变量

name = "Alice"
age = 30
puts "Name: #{name}, Age: #{age}"

将代码保存为 hello.rb。然后运行:

ruby hello.rb

变量作用域:

var   # 局部变量
@var  # 实例变量
$var  # 全局变量

数据类型

Ruby 支持多种数据类型,包括字符串、数字、数组、哈希等。

str = "Hello, Ruby!"             # 字符串
num = 42                         # 数字
arr = [1, 2, 3, 4, 5]            # 数组
hash = {name: "Alice", age: 30}  # 哈希

条件语句

age = 18

if age < 18
  puts "You are a minor."
elsif age >= 18 && age < 65
  puts "You are an adult."
else
  puts "You are a senior."
end

循环

while 循环:

i = 0
while i < 5
  puts "i is #{i}"
  i += 1
end

each 循环:

arr = [1, 2, 3, 4, 5]
arr.each do |num|
  puts num
end

方法

def greet(name)
  return "Hello, #{name}!"
end

puts greet("Alice")

类和对象

# 定义一个 Person 类,用于表示一个人
class Person
  # 使用 attr_accessor 为 name 和 age 属性创建 getter 和 setter 方法
  # 这样就可以在实例外部读取和修改这些属性
  attr_accessor :name, :age

  # initialize 是构造方法,在创建新实例时自动调用
  # 参数:name(字符串)和 age(数字)
  def initialize(name, age)
    # 使用 @ 前缀定义实例变量,属于该对象实例
    @name = name
    @age = age
  end

  # introduce 方法返回一个自我介绍的字符串
  # 使用 #{} 语法进行字符串插值,将变量值嵌入字符串中
  def introduce
    "Hello, my name is #{@name} and I am #{@age} years old."
  end
end

# 创建一个 Person 类的新实例,传入参数 "Alice" 和 30
person = Person.new("Alice", 30)

# 调用 person 对象的 introduce 方法,并将返回的字符串打印到控制台
puts person.introduce

Homebrew Ruby 脚本

Homebrew 使用 Ruby 脚本(称为 Formula)来定义每个软件包的安装过程。一个 Formula 文件通常包含了软件包的名称、版本、来源、依赖关系以及安装方法等信息。

Formula

# Homebrew Formula for Speedtest - Ookla 官方的命令行网速测试工具
class Speedtest < Formula
  # 包的简短描述,显示在 brew info 中
  desc "Ookla Speedtest"

  # 项目主页,指向官方 CLI 应用页面
  homepage "https://speedtest.net/apps/cli"

  # 下载源地址
  # 此 URL 指向 macOS 通用二进制版本(支持 Intel 和 Apple Silicon)
  url "https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-macosx-universal.tgz"

  # 下载文件的 SHA256 校验和,验证文件的完整性和真实性
  sha256 "c9f8192149ebc88f8699998cecab1ce144144045907ece6f53cf50877f4de66f"

  # 包的版本号(显式声明,通常会从 URL 自动推导,但这里明确指定)
  version "1.2.0"

  # install 方法:定义包的安装过程
  # 由于 speedtest 是预编译的二进制文件,安装相对简单
  def install
    # 将 speedtest 可执行文件安装到 Homebrew 的 bin 目录
    # 安装后用户可以在任何地方使用 `speedtest` 命令
    bin.install "./speedtest"

    # 创建 man 页面目录(如果不存在)
    man.mkpath

    # 安装 man 手册页面(第 5 章:文件格式和惯例相关的手册)
    # 安装后用户可以使用 `man speedtest` 查看帮助文档
    man5.install "./speedtest.5"
  end

  # test 方法:安装后自动运行的验证测试
  test do
    # 执行 speedtest 的 --version 命令,获取版本信息输出
    # shell_output() 执行命令并返回输出文本
    # #{bin}/speedtest 会展开为完整的 speedtest 可执行文件路径
    output = shell_output("#{bin}/speedtest --version")

    # 使用正则表达式断言,验证输出中包含版本号 1.2.0
    # \b 表示单词边界,确保匹配完整的版本号而不是部分匹配
    # 如果版本号不在输出中,此测试会失败
    assert_match /\b1\.2\.0\b/, output
  end
end
# Homebrew Formula for Memo - Apple Notes 和 Apple Reminders 的 CLI 管理工具
# 此文件定义了 Homebrew 包的安装、配置和测试规则
class Memo < Formula
  # 混入 Python 虚拟环境支持模块,用于在隔离环境中安装 Python 依赖
  include Language::Python::Virtualenv

  # 包的简短描述,显示在 brew info 和 brew search 中
  desc 'CLI app to manage your Apple Notes and Apple reminders'

  # 项目主页
  homepage 'https://github.com/antoniorodr/memo'

  # 源代码下载地址(特定版本的 release tar 包)
  url 'https://github.com/antoniorodr/memo/releases/download/v0.6.0/memo-0.6.0.tar.gz'

  # 下载文件的 SHA256 校验和,用于验证下载文件的完整性和安全性
  sha256 'dd673c529e0e32dc61ad8cd0560f9507a6ac23533afaca535df207a80e48b883'

  # 开源许可证类型
  license 'MIT'

  # livecheck 块:配置 Homebrew 如何自动检测新版本
  livecheck do
    url :stable  # 从稳定版本页面检查更新
  end

  # depends_on:声明此包的系统级依赖项(使用其他 Homebrew 包)
  # fzf 是一个命令行模糊查找器,此应用需要它
  depends_on 'fzf'
  # 依赖 Python 3.13
  depends_on 'python@3.13'

  # resource 块:声明此包所需的 Python 依赖包(pip 包)
  # Homebrew 会自动下载并在虚拟环境中安装这些包

  # click:用于构建命令行接口的 Python 库
  resource 'click' do
    url 'https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz'
    sha256 '14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5'
  end

  # html2text:将 HTML 转换为 Markdown 或纯文本的库
  resource 'html2text' do
    url 'https://files.pythonhosted.org/packages/f8/27/e158d86ba1e82967cc2f790b0cb02030d4a8bef58e0c79a8590e9678107f/html2text-2025.4.15.tar.gz'
    sha256 '948a645f8f0bc3abe7fd587019a2197a12436cd73d0d4908af95bfc8da337588'
  end

  # mistune:Markdown 解析库,用于处理 Markdown 内容
  resource 'mistune' do
    url 'https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz'
    sha256 '708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a'
  end

  # chardet:字符编码检测库,用于识别文本文件的编码
  resource 'chardet' do
    url 'https://files.pythonhosted.org/packages/19/b6/9df434a8eeba2e6628c465a1dfa31034228ef79b26f76f46278f4ef7e49d/chardet-7.4.3.tar.gz'
    sha256 'cc1d4eb92a4ec1c2df3b490836ffa46922e599d34ce0bb75cf41fd2bf6303d56'
  end

  # install 方法:定义包的安装过程
  # virtualenv_install_with_resources 会:
  #   1. 创建虚拟环境
  #   2. 安装所有声明的 resource(Python 依赖)
  #   3. 在虚拟环境中安装主包
  def install
    virtualenv_install_with_resources
  end

  # test 方法:定义安装后的测试,验证包是否正确安装
  test do
    # 执行 memo 的 --help 命令,获取输出
    output = shell_output("#{bin}/memo --help")
    # 断言输出中包含 'Usage' 字符串,确认帮助命令有效
    assert_match 'Usage', output
  end
end

Cask

# 定义一个 cask 包,名称为 "steam"
cask "steam" do
    version "4.0"     # 包版本为 4.0
    sha256 :no_check  # 不检查下载文件的 SHA-256 校验和

    # 指定包下载 URL,并验证来源域名
    url "https://cdn.cloudflare.steamstatic.com/client/installer/steam.dmg",
        verified: "cdn.cloudflare.steamstatic.com/"

    name "Steam"                                      # 包名称
    desc "Video game digital distribution service"    # 包描述
    homepage "https://store.steampowered.com/about/"  # 包主页链接

    # 定义包的更新检查策略
    livecheck do
    url :url                 # 使用下载 URL 检查更新
    strategy :extract_plist  # 从 Plist 文件中提取版本信息
    end

    auto_updates true  # 指定包支持自动更新

    app "Steam.app"    # 指定要安装的应用程序

    uninstall launchctl: [  # 定义卸载时要停止的服务
                "com.valvesoftware.steam.ipctool",
                "com.valvesoftware.steamclean",
            ],
            quit:      [  # 定义卸载时要退出的进程
                "com.valvesoftware.steam",
                "com.valvesoftware.steam.helper",
                "com.valvesoftware.steam.helper.EH",
            ],
            delete:    "~/Library/Application Support/Steam/Steam.AppBundle"  # 指定要删除的应用支持目录

    zap trash: [  # 定义清理时要删除的残留数据
    "~/Library/Application Support/Steam/",
    "~/Library/LaunchAgents/com.valvesoftware.steamclean.plist",
    "~/Library/Preferences/com.valvesoftware.steam.helper.plist",
    "~/Library/Saved Application State/com.valvesoftware.steam.savedState/",
    ]

    caveats do
    requires_rosetta  # 提示该应用需要 Rosetta 翻译环境
    end
end
posted @ 2024-06-27 14:38  undefined443  阅读(46)  评论(0)    收藏  举报