Ruby 零基础教程

Ruby 基础语法

在本章中,我们将深入探讨 Ruby 代码的基础构件:注释空白符语句。理解这些元素有利于编写整洁、易读且可维护的代码。

  • 注释允许你为代码添加注解,解释其目的和功能。
  • 空白符虽然常被忽视,但在代码的可读性和结构中扮演着重要角色。
  • 语句则是 Ruby 解释器执行的指令,构成了程序的核心逻辑。

掌握这些基础知识,将为你未来的 Ruby 编程之旅打下坚实的地基。

1. Ruby 中的注释 (Comments)

注释是你代码中的说明性文字,Ruby 解释器在运行时会完全忽略它们。注释对于让你自己和其他开发者理解代码逻辑至关重要。Ruby 支持两种主要的注释方式:单行注释和多行注释。

1.1 单行注释

单行注释以 # 符号开始。同一行中 # 及其后面的所有内容都会被视为注释。

# 这是一个 Ruby 的单行注释。
puts "Hello, world!" # 这行代码在控制台打印一句问候语。

示例场景:
假设你正在编写一个计算长方形面积的程序,你可以使用注释来解释每一个步骤:

# 获取长方形的宽度
width = 10 # 暂时假设宽度为 10

# 获取长方形的高度
height = 5 # 暂时假设高度为 5

# 计算长方形的面积
area = width * height

# 将面积打印到控制台
puts "长方形的面积是:#{area}"

1.2 多行注释 (区块注释)

多行注释被包含在 =begin=end 指令之间。这两个指令之间的所有行都会被视为注释。(注意:=begin=end 必须位于行首,前面不能有空格)。

=begin
这是一个多行注释。
它可以跨越多行,非常适合用于提供
更详细的说明,或者临时禁用
一大段代码。
=end
puts "这行代码将会被执行。"

示例场景:
假设你要为一个复杂的计算阶乘的函数编写文档:

=begin
这个方法用于计算给定数字的阶乘。
它接收一个整数作为输入,并返回其阶乘结果。
如果输入是负数,作为特殊情况,它将返回 1。
=end
def factorial(n)
  if n < 0
    return 1
  elsif n == 0
    return 1
  else
    return n * factorial(n-1)
  end
end

puts factorial(5) # 输出: 120

1.3 编写注释的最佳实践

  • 保持清晰: 注释应该清晰、简明扼要且易于理解。
  • 保持准确: 确保注释准确反映了代码的功能。修改代码时,务必同步更新注释。
  • 解释“为什么”: 重点解释代码为什么要这样做,而不是仅仅重复代码在做什么。假设阅读者已经懂基础的 Ruby 语法。
  • 避免过度注释: 不要给每一行简单的代码都加注释。把精力集中在解释复杂的逻辑或不明显的行为上。
  • 注意拼写和语法: 良好的文字表达能提升代码的专业度和可读性。

2. Ruby 中的空白符 (Whitespace)

空白符指的是代码中的空格 (spaces)、制表符 (tabs) 和换行符 (newlines)。虽然 Ruby 解释器通常会忽略多余的空白符,但它对于代码的人类可读性和结构展现至关重要。

2.1 空白符的重要性

  • 可读性: 正确的缩进和间距让代码一目了然。
  • 语句分隔: 换行符是分隔不同语句的主要方式。
  • 语法意义: 在某些特定情况下,空白符会影响语法。例如,Ruby 区分带括号和不带括号的方法调用时,空格的处理会有所不同。

2.2 缩进 (Indentation)

缩进是 Ruby 空白符中最重要的一环。一致的缩进能直观地展现代码的层级结构,特别是在控制流语句(如 ifelsewhile)和方法定义中。

示例:

def greet(name)
  if name == "Alice"
    puts "Hello, Alice!"
  else
    puts "Hello, stranger!"
  end
end

greet("Alice") # 输出: Hello, Alice!
greet("Bob")   # 输出: Hello, stranger!

在这个例子中,ifelse 块内部的代码都被缩进了,清晰地表明了它们从属于这些条件块。

2.3 间距 (Spacing)

合理使用空格可以提升可读性,尤其是在操作符周围和逗号之后。

示例:

# 好的做法 (Good)
x = 1 + 2
array = [1, 2, 3]

# 糟糕的做法 (Bad)
x=1+2
array=[1,2,3]

2.4 换行 (Newlines)

换行符用于分隔语句。Ruby 通常将每一行视为一个独立的语句,除非该语句明显未完成(例如行尾是个 + 号)或者跨越了多行。

示例:

x = 1
y = 2
puts x + y # 输出: 3

你也可以使用分号 (;) 将多个语句写在同一行,但这通常不推荐,因为会降低可读性。

x = 1; y = 2; puts x + y # 输出: 3 (不推荐这种写法)

2.5 空白符使用的最佳实践

  • 一致的缩进: 在整个项目中坚持使用同一种缩进风格。绝大多数 Ruby 开发者偏好使用 2 个空格进行缩进。
  • 操作符周围加空格: 在等号、加减乘除等操作符两边加上空格(如 =, +, -, *, /)。
  • 逗号后加空格: 在列表、数组和方法参数中的逗号后面加一个空格。
  • 避免多余的空行: 适度使用空行来分隔代码的逻辑块,不要滥用。
  • 使用支持自动格式化的编辑器: 现代代码编辑器可以根据既定的风格指南自动格式化你的代码。

3. Ruby 中的语句 (Statements)

语句是 Ruby 程序中执行的基本单元。它们是 Ruby 解释器执行具体动作的指令。

3.1 语句的类型

  • 赋值语句 (Assignment Statements): 将一个值赋予一个变量。
x = 10
name = "Alice"

方法调用 (Method Calls): 调用一个方法来执行特定的任务。

puts "Hello, world!"
result = Math.sqrt(25)

控制流语句 (Control Flow Statements): 根据条件控制代码的执行路径。

if x > 5
  puts "x 大于 5"
end

循环语句 (Looping Statements): 多次重复执行一个代码块。

while x < 10
  puts x
  x += 1
end

返回语句 (Return Statements): 从方法中返回一个值。

def add(a, b)
  return a + b
end

3.2 语句的结束

在 Ruby 中,语句通常由换行符来结束。正如前面提到的,你也可以使用分号 (;) 在单行内分隔多个语句,但为了代码的美观和易读,尽量避免这样做。

3.3 复合语句 (Compound Statements)

控制流语句和循环语句属于复合语句,因为它们内部包含了其他语句。这些内部语句会根据特定的条件或循环规则来执行。

if x > 5
  puts "x 大于 5"  # 内部语句 1
  y = x * 2      # 内部语句 2
end

3.4 表达式语句 (Expression Statements)

在 Ruby 中,几乎所有东西都是表达式,这意味着它们在执行后都会计算出一个值。因此,即使是简单的表达式也可以作为独立的语句存在。

x + 5  # 这是一个合法的语句,尽管它计算完结果后并没有做任何处理

然而,在实际开发中,你通常需要对表达式的结果进行处理,比如把它赋值给变量,或者作为参数传递给方法。

3.5 编写语句的最佳实践

  • 一行一语句: 为了最佳的可读性,坚持每行只写一个语句。
  • 清晰简洁: 编写易于理解和维护的语句。
  • 有意义的变量名: 使用具有描述性的变量名,让代码本身具备一定的自文档能力 (self-documenting)。
  • 避免副作用: 尽量减少语句中的副作用,使代码更具可预测性。副作用是指一个语句修改了其直接作用域之外的状态(例如修改了全局变量)。