在 Ruby 脚本中引用全局变量(块与函数)
Referencing global variables in a Ruby script (Block vs Function)
我正在 Ruby 中为我的点文件构建安装脚本。为了解析一些简单的标志,我使用 OptionParser。
我想读取 -f
标志以强制覆盖现有文件。一切正常。 Flag 将存储在 options
散列中。
options = {}
option_parse = OptionParser.new do |opt|
opt.on('-f', '--force') do
options[:force] = true
puts 'force overwrite'
end
end
option_parse.parse!
所以我将我的代码重构为函数。
在函数中,如果不将其设置为全局变量,我将无法使用 options
。
现在我有两个问题:
- 如果我必须将变量定义为全局变量并且仅通过函数定义它是不够的(没有 类,只是一个脚本),Ruby 对变量做了什么?
$options
和 OPTIONS
在全局上下文中的行为是否相同?
ruby 顶级范围 behaves both like a class and like an instance。
当您在该上下文中定义方法时,它们将成为 Object
class 中的私有方法。
局部变量的行为也有点像 class。它们在 class 定义中是本地的,因此在实例中不可访问(您定义的方法结束的地方)。
以$
开头的变量是全局变量。它们随处可见。解释器需要美元符号来区分局部变量和全局变量。
以大写字母开头的变量是常量。当你创建一个常量时,它会进入你当时所在的任何 class 或模块。常量可以在封闭的 class 或模块以及任何继承的 class 中引用。也可以使用像这样的完全限定名称来引用常量 "from the outside":MyModule::MyClass::MyConstant
。
常量与全局变量的区别在于它们的作用域。常量存在于 class 或模块中,而全局变量只是 - global.
这里有一些例子:
$foo = 'bar'
BAZ = 'qux'
def x
puts $foo, BAZ
end
x
# bar
# qux
class A
B = 'C'
def self.say
puts B
end
def say
puts B
end
end
A.say
# C
A.new.say
# C
puts A::B
# C
puts B
# => raises an error
我正在 Ruby 中为我的点文件构建安装脚本。为了解析一些简单的标志,我使用 OptionParser。
我想读取 -f
标志以强制覆盖现有文件。一切正常。 Flag 将存储在 options
散列中。
options = {}
option_parse = OptionParser.new do |opt|
opt.on('-f', '--force') do
options[:force] = true
puts 'force overwrite'
end
end
option_parse.parse!
所以我将我的代码重构为函数。
在函数中,如果不将其设置为全局变量,我将无法使用 options
。
现在我有两个问题:
- 如果我必须将变量定义为全局变量并且仅通过函数定义它是不够的(没有 类,只是一个脚本),Ruby 对变量做了什么?
$options
和OPTIONS
在全局上下文中的行为是否相同?
ruby 顶级范围 behaves both like a class and like an instance。
当您在该上下文中定义方法时,它们将成为 Object
class 中的私有方法。
局部变量的行为也有点像 class。它们在 class 定义中是本地的,因此在实例中不可访问(您定义的方法结束的地方)。
以$
开头的变量是全局变量。它们随处可见。解释器需要美元符号来区分局部变量和全局变量。
以大写字母开头的变量是常量。当你创建一个常量时,它会进入你当时所在的任何 class 或模块。常量可以在封闭的 class 或模块以及任何继承的 class 中引用。也可以使用像这样的完全限定名称来引用常量 "from the outside":MyModule::MyClass::MyConstant
。
常量与全局变量的区别在于它们的作用域。常量存在于 class 或模块中,而全局变量只是 - global.
这里有一些例子:
$foo = 'bar'
BAZ = 'qux'
def x
puts $foo, BAZ
end
x
# bar
# qux
class A
B = 'C'
def self.say
puts B
end
def say
puts B
end
end
A.say
# C
A.new.say
# C
puts A::B
# C
puts B
# => raises an error