📅  最后修改于: 2023-12-03 15:41:13.586000             🧑  作者: Mango
红宝石(Ruby)是一种动态、面向对象的编程语言。它既是一种简洁灵活的脚本语言,也是一种功能强大、面向对象的编程语言。红宝石拥有一套强大的标准库和活跃的开源社区,能够帮助开发者快速构建复杂的应用程序。
范围(Scope)是指程序中变量被声明的有效范围,它通常与作用域(Scope)的概念相等。在红宝石中,变量的作用域可以分为以下几种范围:块级作用域(Block)、局部作用域(Local)、实例变量作用域(Instance)、与全局作用域(Global)。
本文将介绍红宝石中的四种作用域,并提供了一些常用方法的示例。
块级作用域是指在代码块中声明的变量只在该代码块中有效,一旦离开代码块,该变量就会被销毁。在红宝石中,代码块可以用 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。
局部作用域是指在方法中声明的变量只在该方法中有效,一旦方法执行结束,该变量就会被销毁。例如:
def foo
x = 50
puts x
end
foo # 输出 50
puts x # 报错,未定义变量 x
在上面的代码中,变量 x 只在方法 foo 中定义和使用,当方法执行结束后,x 就被销毁了。
实例变量作用域是指在类的实例中定义的变量,在整个类的实例中都是可用的。例如:
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_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 方法是 Ruby 常用的方法之一,用于遍历集合中的每个元素,并执行给定的块。例如:
array = [1, 2, 3, 4, 5]
array.each do |elem|
puts elem
end
# 输出
# 1
# 2
# 3
# 4
# 5
map 方法用于遍历集合中的每个元素,并返回一个新的集合,该集合由执行块时返回的每个值组成。例如:
array = [1, 2, 3, 4, 5]
new_array = array.map { |elem| elem * 2 }
puts new_array
# 输出
# [2, 4, 6, 8, 10]
select 方法用于遍历集合中的每个元素,并返回一个新的集合,该集合由执行块时返回值为 true 的元素组成。例如:
array = [1, 2, 3, 4, 5]
new_array = array.select { |elem| elem > 3 }
puts new_array
# 输出
# [4, 5]
inject 方法用于遍历集合中的每个元素,并使用指定的初始值和执行块来计算一个结果。例如:
array = [1, 2, 3, 4, 5]
result = array.inject(0) { |sum, elem| sum + elem }
puts result
# 输出
# 15
在上面的代码中,我们使用 inject 方法计算了数组中所有元素的和,初始值为 0。