繁体   English   中英

在Ruby脚本中引用全局变量(块与函数)

[英]Referencing global variables in a Ruby script (Block vs Function)

我正在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

现在我有两个问题:

  1. 如果我必须将变量定义为全局变量,并且不足以通过函数定义变量(没有类,仅是脚本),Ruby会如何处理?
  2. $optionsOPTIONS在全局上下文中的行为是否相同?

红宝石顶级作用域的行为既类似于类又类似于实例

当您在该上下文中定义方法时,它们将成为Object类上的私有方法。

局部变量的行为也类似于类。 它们是类定义的局部变量,因此在实例中无法访问(定义的方法最终会到达实例)。

$开头的变量是全局变量。 它们随处可见。 口译员需要美元符号才能区分本地人和全球人。

以大写字母开头的变量是常量。 创建常量时,它将进入您当时所在的任何类或模块。 可以在封闭类或模块以及任何继承类中引用常量。 也可以使用完全限定的名称(例如: MyModule::MyClass::MyConstant从外部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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM