📜  红宝石 |范围 === 方法(1)

📅  最后修改于: 2023-12-03 15:41:13.586000             🧑  作者: Mango

红宝石 | 范围与方法

简介

红宝石(Ruby)是一种动态、面向对象的编程语言。它既是一种简洁灵活的脚本语言,也是一种功能强大、面向对象的编程语言。红宝石拥有一套强大的标准库和活跃的开源社区,能够帮助开发者快速构建复杂的应用程序。

范围(Scope)是指程序中变量被声明的有效范围,它通常与作用域(Scope)的概念相等。在红宝石中,变量的作用域可以分为以下几种范围:块级作用域(Block)、局部作用域(Local)、实例变量作用域(Instance)、与全局作用域(Global)。

本文将介绍红宝石中的四种作用域,并提供了一些常用方法的示例。

块级作用域(Block)

块级作用域是指在代码块中声明的变量只在该代码块中有效,一旦离开代码块,该变量就会被销毁。在红宝石中,代码块可以用 do..end 或 {} 表示。例如:

x = 10
1.times do
  x = 20
end
puts x  # 输出 20

x = 10
1.times { x = 20 }
puts x  # 输出 20

在上面的代码中,变量 x 的值在代码块中被重新赋值为 20,但是因为 x 是在代码块之外定义的,所以改变是持久性的,输出 20。

局部作用域(Local)

局部作用域是指在方法中声明的变量只在该方法中有效,一旦方法执行结束,该变量就会被销毁。例如:

def foo
  x = 50
  puts x
end
foo  # 输出 50

puts x  # 报错,未定义变量 x

在上面的代码中,变量 x 只在方法 foo 中定义和使用,当方法执行结束后,x 就被销毁了。

实例变量作用域(Instance)

实例变量作用域是指在类的实例中定义的变量,在整个类的实例中都是可用的。例如:

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def greeting
    puts "Hello, my name is #{@name}, and I am #{@age} years old."
  end
end

p = Person.new("Alice", 30)
p.greeting  # 输出 "Hello, my name is Alice, and I am 30 years old."

在上面的代码中,变量 @name 和 @age 只在类的实例中定义和使用,它们在 greeting 方法中被调用。因为它们都是实例变量,所以在类的实例中都是可用的。

全局作用域(Global)

全局作用域是指在整个程序中都可以使用的变量,一旦定义后,就可以在所有的代码块和方法中使用。但是,由于全局变量会影响整个程序的运行,所以建议尽量避免使用全局变量。例如:

$global_var = "I am a global variable"

def foo
  puts $global_var
end

foo  # 输出 "I am a global variable"

def bar
  puts $global_var
end

bar  # 输出 "I am a global variable"

在上面的代码中,变量 $global_var 是一个全局变量,可以被 foo 和 bar 方法中使用。

常用方法示例
each 方法

each 方法是 Ruby 常用的方法之一,用于遍历集合中的每个元素,并执行给定的块。例如:

array = [1, 2, 3, 4, 5]
array.each do |elem|
  puts elem
end

# 输出
# 1
# 2
# 3
# 4
# 5
map 方法

map 方法用于遍历集合中的每个元素,并返回一个新的集合,该集合由执行块时返回的每个值组成。例如:

array = [1, 2, 3, 4, 5]
new_array = array.map { |elem| elem * 2 }
puts new_array

# 输出
# [2, 4, 6, 8, 10]
select 方法

select 方法用于遍历集合中的每个元素,并返回一个新的集合,该集合由执行块时返回值为 true 的元素组成。例如:

array = [1, 2, 3, 4, 5]
new_array = array.select { |elem| elem > 3 }
puts new_array

# 输出
# [4, 5]
inject 方法

inject 方法用于遍历集合中的每个元素,并使用指定的初始值和执行块来计算一个结果。例如:

array = [1, 2, 3, 4, 5]
result = array.inject(0) { |sum, elem| sum + elem }
puts result

# 输出
# 15

在上面的代码中,我们使用 inject 方法计算了数组中所有元素的和,初始值为 0。