奇怪的Ruby范围问题(我认为)

时间:2013-05-30 14:33:32

标签: ruby vagrant

我对Ruby的了解很少,但我正在为我的办公室开发一个Vagrant VM。我在变量中配置了设置,以便我们的每个开发人员都可以轻松进行自定义,但是当我尝试从外部文件中包含变量时,我遇到了问题。

这是我正在做的事情的基本要点(这是有效的):

# Local (host) system info
host_os = "Windows"
nfs_enabled = false

# IP and Port Configuration
vm_ip_address = "33.33.33.10"
vm_http_port = 80
host_http_port = 8888
vm_mysql_port = 3306
host_mysql_port = 3306   # Warning, mysql port configuration using 3306 will interfere with any locally run MySQL server.
local_sites_path = "D:\\Web"
vm_sites_path = ENV["HOME"] + "/Sites"

# VM Configuration
vm_memory = "1024"

Vagrant.configure("2") do |config|
  ... do vagrant stuff here

但是,这不起作用(config.local.rb的内容与上面的变量声明匹配):

if(File.file?("config.local.rb"))
  require_relative 'config.local.rb'
else
  # Local (host) system info
  host_os = "Mac"
  nfs_enabled = true

  # IP and Port Configuration
  vm_ip_address = "33.33.33.10"
  vm_http_port = 80
  host_http_port = 8888
  vm_mysql_port = 3306
  host_mysql_port = 3306   # Warning, mysql port configuration using 3306 will interfere with any locally run MySQL server.
  local_sites_path = ENV["HOME"] + "/Sites"
  vm_sites_path = ENV["HOME"] + "/Sites"

  # VM Configuration
  vm_memory = "512"
end

Vagrant.configure("2") do |config|
  ... do vagrant stuff here

这里有什么想法吗?在这两种情况下,变量声明都位于文件的顶部,因此我的理解是它们应该在全局范围内。

以下是config.local.rb的内容:

# Duplicate to config.local.rb to activate. Override the variables set in the Vagrantfile to tweak your local VM.

# Local (host) system info
host_os = "Windows"
nfs_enabled = false

# IP and Port Configuration
vm_ip_address = "33.33.33.10"
vm_http_port = 80
host_http_port = 8888
vm_mysql_port = 3306
host_mysql_port = 3306   # Warning, mysql port configuration using 3306 will interfere with any locally run MySQL server.
local_sites_path = "D:\\Web"
vm_sites_path = ENV["HOME"] + "/Sites"

# VM Configuration
vm_memory = "1024"

正如我所说,我之前并没有真正使用过Ruby,但我所知道的关于编程和范围的一切都说这应该可以正常工作。我已检查(使用print语句)脚本正在检测并包含该文件,但由于某种原因它不起作用,除非我直接在Vagrantfile中硬编码配置设置。

提前致谢。

2 个答案:

答案 0 :(得分:1)

以小写字母开头的变量是局部变量。它们被称为“本地”变量,因为它们是定义它们的范围的本地变量。在您的情况下,它们是config.local.rb的脚本主体的本地变量。除config.local.rb的脚本主体外,无法从其他任何位置访问它们。这就是他们“本地化”的原因。

如果需要全局变量,则需要使用全局变量。全局变量以$符号开头。

答案 1 :(得分:0)

Jorg对本地变量和全局变量的解释是正确的。下面是一个可能的替代实现,可能会按照您的意愿执行。

config.local.rb中将您的配置声明为哈希:

{
  host_os: "Windows",
  nfs_enabled: false
  # etc, etc.
}

在您的其他档案中:

if File.exist?("config.local.rb"))
  config = File.read("config.local.rb")
else
  config = {
    host_os: "Mac",
    nfs_enabled: true
    # etc, etc.
  }
end

您的config哈希现在拥有您的所有数据。

如果这种方法看起来更符合您的需求,那么您应该将配置数据放在YAML文件而不是Ruby文件中:How do I parse a YAML file?