Ruby 起步:对象、方法、集合与脚本
安装与第一次运行
Ruby是动态类型、面向对象语言,Rails是其Web框架而非语言本身。无需先安装Rails或数据库即可学习脚本、标准库与测试。2026-10-17核对:Windows使用官方站点推荐的RubyInstaller4.0.7-1 x64便携包;Linux使用Ubuntu26.04发行版Ruby3.3.8-2ubuntu3.1。语言与Data类示例兼容3.3/4.0,发行版安全补丁不等于上游版本号同步,后续部署按官方分支维护与发行版公告核对。
Windows从RubyInstaller下载选择对应架构,纯脚本可解压不带Devkit的包,用PowerShell & 'D:/tools/ruby/bin/ruby.exe' -v;带原生扩展的gem另需编译工具,不能把纯脚本通过写成原生扩展也兼容。Linux可按Ruby安装使用发行版包,确认ruby -v与gem env来自同一环境。
hello.rb完整文件:
puts 'Hello, Ruby!'ruby -c hello.rb检查语法,ruby hello.rb输出Hello, Ruby!;irb进入交互解释器,适合试一条表达式,不代替可重复文件。require载入库一次;require_relative以当前文件目录定位依赖,避免依赖启动工作目录。命令行参数为ARGV,程序退出码用exit;本项目无gem依赖。
对象、变量、真假与字符串
变量保存对象引用,不写静态类型声明;运行时通过方法调用决定能力。整数、字符串、类本身都是对象,但“所有东西都是对象”不代表所有操作都可以随意调用。仅false和nil为假,0、空字符串、空数组都为真,这与PHP等语言不同。==用于值相等的约定,equal?检查对象身份,Hash键依赖hash/eql?;自定义值对象要保持一致。
完整示例:
completed = 2
goal = 3
nickname = nil
puts "#{nickname || 'reader'}: #{completed}/#{goal}" if completed < goal
first = ['ruby']
second = first
second << 'test'
puts first.length
puts(0 ? 'zero is true' : 'false')输出reader: 2/3、2、zero is true。赋值复制引用,dup通常浅复制,嵌套对象仍共享;freeze限制接收对象的修改,不自动深冻结其元素。# frozen_string_literal: true让文件字符串字面量冻结,需累加字符串时可显式用可变缓冲;它不是“所有字符串全局冻结”。Symbol如:amount适合有限固定标识;String适合外部文本,不应为任意用户数据无依据转符号。
方法、参数、条件与模块
方法最后表达式通常就是返回值,显式return用于早退。关键字参数与位置Hash要区分,Ruby3之后不要依赖旧版自动转换行为。下面完整程序:
def total(values, minimum: 0)
values.sum do |value|
raise ArgumentError, 'integer required' unless value.is_a?(Integer)
value >= minimum ? value : 0
end
end
puts total([80, 90, 100], minimum: 90)输出190。do ... end传一个block,后续block与Enumerable解释yield。if/unless按真假判断,case可以用范围或类的===语义匹配,不能当字符串switch简单替换。while用于重复,each用于集合遍历;在错误恢复边界用begin/rescue/ensure,后页会给完整资源协议。
class定义实例状态和行为,@name是实例变量,@@共享类变量容易引起继承混淆;类实例变量与普通实例变量也有不同接收者。module既能组织名字又能混入行为,include/prepend会改变方法查找链,不是简单复制文本。内部依赖用require_relative,公开库需要规划命名空间,避免顶层方法意外覆盖。
Array、Hash、Range与空值
Array有序且可变,Hash映射键值并保留插入顺序,Range表示区间;0...n不含n,0..n含n。map返回新数组,each主要执行副作用,select过滤,sum聚合。命名带!的方法惯例上修改接收者或更危险,但不是语法强制;也不是所有原地修改都带!,例如Array#<<。
Hash.new(0)对计数器合适,因为整数不可变且通过+=写回键。Hash.new([])会让缺键共享同一数组而且通常不存入键,是常见陷阱;用Hash.new { |h,k| h[k] = [] }为每个缺键创建数组。索引缺键返回nil或默认值,fetch可要求存在并抛KeyError。报告排序应显式sort,不把插入顺序当字母排序。
练习与参考解法
练习:判断0、""、[]、nil的真假;复制包含数组的Hash后修改内层数组,预测谁变化;对同一缺键两次<<比较Hash.new([])与block构造;将total的minimum写成位置参数会怎样?
参考解法
只有nil为假,另外三个都真。dup默认浅复制,内部数组共享;需要独立数据时按业务逐层复制或使用不可变结构。默认共享数组会跨缺键混杂,并可能没有键被保存;block构造按键存储新数组。关键字与位置参数合同不同,调用必须匹配,不靠旧版隐式Hash转换。完整数据应用在分类账。
依据:中文20分钟Ruby、Ruby语法、Hash、维护分支。
继续阅读
- 开发实践
- 对象与枚举