Ruby 语法
Ruby 语法中文讲解
Ruby 是一种简洁、优雅且强大的编程语言,以其直观的语法和面向对象的特性受到开发者喜爱。以下是对 Ruby 语法的基础讲解,涵盖核心概念、常见结构和中文处理相关内容,基于 Ruby 3.4.x(截至 2025 年 8 月的最新稳定版)。本文适合初学者,同时提供中文相关的注意事项。
1. 基础语法概述
Ruby 的语法设计注重简洁和人类可读性,强调“最小惊讶原则”。以下是 Ruby 的核心语法特点:
- 动态类型:变量无需声明类型。
- 面向对象:一切皆对象,包括数字和字符串。
- 块和迭代器:使用块(blocks)简化循环和逻辑。
- 中文支持:默认使用 UTF-8 编码,适合处理中文字符串。
2. 基本语法元素
2.1 注释
- 单行注释:以
#
开头。
# 这是一个单行注释
puts "你好"
- 多行注释:使用
=begin
和=end
。
=begin
这是一个多行注释
支持中文说明
=end
2.2 变量
- Ruby 有五种变量类型:
- 局部变量:小写字母或下划线开头,如
name
。 - 实例变量:以
@
开头,如@name
。 - 类变量:以
@@
开头,如@@count
。 - 全局变量:以
$
开头,如$global
。 - 常量:大写字母开头,如
NAME
。 - 示例:
name = "小明" # 局部变量
@age = 20 # 实例变量
@@count = 0 # 类变量
$version = "3.4" # 全局变量
NAME = "常量" # 常量
puts name, @age, @@count, $version, NAME
2.3 数据类型
- 数字:
age = 25
price = 99.99
- 字符串(支持中文):
greeting = "你好,世界!"
puts greeting.encoding # 输出: UTF-8
- 符号(轻量级不可变字符串):
key = :name
- 数组:
fruits = ["苹果", "香蕉", "橙子"]
puts fruits[0] # 输出: 苹果
- 哈希:
person = { name: "小明", age: 20 }
puts person[:name] # 输出: 小明
- 范围:
range = 1..5 # 包含 1 到 5
puts range.to_a # 输出: [1, 2, 3, 4, 5]
2.4 编码声明
- Ruby 默认使用 UTF-8,中文处理需在文件开头声明:
# encoding: UTF-8
puts "中文字符串"
- 若处理 GBK(常见于 Windows),声明:
# encoding: GBK
3. 控制结构
3.1 条件语句
- if/else:
age = 18
if age >= 18
puts "成年人"
else
puts "未成年人"
end
- unless(相当于
if not
):
unless age >= 18
puts "未成年人"
else
puts "成年人"
end
- 三元运算符:
status = age >= 18 ? "成年人" : "未成年人"
puts status
3.2 循环
- while:
count = 0
while count < 3
puts "第 #{count} 次"
count += 1
end
- each 迭代器(更常用):
["苹果", "香蕉", "橙子"].each do |fruit|
puts "水果: #{fruit}"
end
- for:
for i in 1..3
puts "第 #{i} 次"
end
3.3 块(Blocks)
- 块是 Ruby 的核心特性,常与迭代器一起使用。
3.times { puts "你好!" }
或多行形式:
[1, 2, 3].each do |n|
puts "数字: #{n}"
end
4. 函数(方法)
- 定义方法使用
def
:
def greet(name)
"你好,#{name}!"
end
puts greet("小明") # 输出: 你好,小明!
- 默认参数:
def welcome(name = "朋友")
"欢迎,#{name}!"
end
puts welcome # 输出: 欢迎,朋友!
- 返回值:Ruby 自动返回最后一行表达式的值,或使用
return
:
def add(a, b)
return a + b
end
puts add(2, 3) # 输出: 5
5. 类与面向对象
Ruby 是纯粹的面向对象语言,一切皆对象。
5.1 定义类
class Person
# 构造函数
def initialize(name, age)
@name = name # 实例变量
@age = age
end
# 实例方法
def introduce
"我叫#{@name},#{@age}岁"
end
# 类方法
def self.description
"这是一个 Person 类"
end
end
person = Person.new("小明", 20)
puts person.introduce # 输出: 我叫小明,20岁
puts Person.description # 输出: 这是一个 Person 类
5.2 继承
class Student < Person
def study
"#{@name} 在学习"
end
end
student = Student.new("小红", 18)
puts student.introduce # 输出: 我叫小红,18岁
puts student.study # 输出: 小红 在学习
5.3 模块(Module)
- 用于组织代码或混入(Mixin):
module Greetable
def say_hello
"你好!"
end
end
class Person
include Greetable
end
person = Person.new
puts person.say_hello # 输出: 你好!
6. 中文处理相关语法
Ruby 对中文支持良好,但需注意编码和字符串操作:
- 字符串编码:
- 检查编码:
ruby str = "你好,世界!" puts str.encoding # 输出: UTF-8
- 转换编码:
ruby gbk_str = str.encode("GBK") puts gbk_str.encoding # 输出: GBK
- 中文字符串操作:
- 长度计算(按字符):
ruby str = "你好" puts str.length # 输出: 2
- 按字符迭代:
ruby str.each_char { |c| puts c } # 输出: 你\n好
- 正则表达式:
ruby str = "你好,世界!" puts str.match(/[你世]/).to_a # 输出: ["你", "世"]
- 文件操作与中文:
- 读取中文文件:
ruby # encoding: UTF-8 File.open("中文.txt", "r:UTF-8") { |f| puts f.read }
- 写入中文:
ruby # encoding: UTF-8 File.write("output.txt", "你好,世界!", encoding: "UTF-8")
7. 异常处理
使用 begin/rescue/end
处理错误:
begin
File.open("不存在.txt", "r")
rescue Errno::ENOENT
puts "文件不存在!"
rescue StandardError => e
puts "错误: #{e.message}"
end
8. 常见问题与中文相关注意事项
- 中文乱码:
- 确保文件保存为 UTF-8(无 BOM)。
- 在脚本开头添加
# encoding: UTF-8
。 - Windows CMD 用户设置:
bash chcp 65001
- 或使用 PowerShell/Windows Terminal。
- 字符串操作问题:
- 中文字符按单个字符计算长度,不按字节:
ruby str = "你好" puts str.bytesize # 输出: 6(UTF-8 中每个中文字符占 3 字节) puts str.length # 输出: 2(字符数)
- 正则表达式与中文:
- 使用 Unicode 范围匹配中文:
ruby str = "你好,world!" puts str.scan(/\p{Han}/) # 输出: ["你", "好"]
9. 最佳实践
- 编码统一:始终使用 UTF-8,脚本、文件和终端保持一致。
- 命名规范:变量和方法名使用小写加下划线(如
user_name
),常量大写(如MAX_COUNT
)。 - 使用块:优先使用
each
、map
等迭代器,减少显式循环。 - 模块化:使用模块组织代码,提高复用性。
10. 进阶建议
- 学习 Rails:Ruby on Rails 框架基于 Ruby 语法,适合 Web 开发。
- 调试工具:
- 安装
pry
:bash gem install pry
- 示例:
ruby require 'pry' str = "你好" binding.pry # 进入交互式调试
- 国际化(i18n):
- 在 Rails 中使用
i18n
gem 处理中文:yaml # config/locales/zh-CN.yml zh-CN: hello: "你好"
11. 社区资源
- Ruby 官方文档:ruby-doc.org
- Ruby China:ruby-china.org
- 《Programming Ruby》(Pickaxe Book)
通过以上讲解,你可以掌握 Ruby 的基本语法并处理中文相关任务。如果需要深入某个主题(如类设计、Rails 或复杂中文处理),请告诉我!