我正在使用Ruby为我的dotfiles构建一个安装脚本。要解析一些简单的标志,我使用OptionParser。
我想阅读-f
标志以强制覆盖现有文件。一切正常。该标志将存储在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
而不将其设置为全局变量。
现在我有两个问题:
$options
和OPTIONS
在全局范围内的行为方式相同吗? 答案 0 :(得分:1)
ruby顶级范围behaves both like a class and like an instance。
在该上下文中定义方法时,它们将成为Object
类的私有方法。
局部变量的行为也类似于类。它们是类定义的本地,因此在实例中不可访问(您定义的方法最终)。
以$
开头的变量是全局变量。它们随处可见。解释器需要美元符号才能告诉当地人和全球人。
以大写字母开头的变量是常量。当你创建一个常量时,它会进入你当时所处的任何类或模块中。可以在封闭类或模块以及任何继承类中引用常量。常数也可以从外部引用""通过使用如下所示的完全限定名称:MyModule::MyClass::MyConstant
。
常量与全局变量的区别在于它们的范围。常量生活在类或模块中,而全局变量只是 - 全局。
以下是一些例子:
$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