我在OS X 10.9上使用Vagrant 1.4.2和Nugrant plug-in 1.4.1。在我的.vagrantfile
中,我有以下内容:
myvar:
a: 'hello'
我可以像a
那样访问Vagrantfile
中puts "* The value of config.user.myvar.a is %s." % [config.user.myvar.a]
的值:
vagrant up
以上代码在我发出* The value of config.user.myvar.a is hello.
时打印以下内容:
a
但是,我想设置defined?
可选,所以我添加了一个Ruby config.user.myvar.a
检查以查看是否已定义puts
。为了便于说明,我保留原始if defined? (config.user.myvar.a)
puts "* config.user.myvar.a EXISTS (%s)" % [config.user.myvar.a]
else
puts "* config.user.myvar.a DOES NOT EXIST"
end
puts "* The value of config.user.myvar.a is %s." % [config.user.myvar.a]
命令:
* config.user.myvar.a DOES NOT EXIST
* The value of config.user.myvar.a is hello.
这会产生以下矛盾:
config.user.myvar.a
为什么我可以打印defined?
的值,但不能使用{{1}}
答案 0 :(得分:1)
我不熟悉该插件,但它似乎使用Ruby的method_missing
从Hash中获取配置密钥,但它没有定义respond_to?
方法。因此define?
无效。
相反,似乎有has?
方法,所以你可以尝试:
if config.user.myvar.has?(:a)
或者,如果未设置,则值为nil
:
if !config.user.myvar.a.nil?
答案 1 :(得分:0)
使用 tmatilai 的输入,我发现问题出现是因为Nugrant插件不支持Ruby的define?
。其他人有similar problems using has?
with version 1.4.1 of the Nugrant plug-in,已在版本1.4.2中修复。
我已升级到Nugrant 1.4.2,并发现使用myvar
检查if config.user.has?(:myvar)
现在可以正常运行,但检查myvar.a
if defined?(config.user.myvar.a)
或if config.user.myvar.has?(:a)
在未定义myvar.a
时导致未定义的方法错误。不是Ruby程序员,我决定改变策略,简单地将.vagrantuser
中的结构展平为:
myvar_a: 'hello'
myvar_b: 'hallo'
而不是:
myvar:
a: 'hello'
b: 'hallo'
现在我只需检查myvar_a
或myvar_b
:
if config.user.has?(:myvar_a)
puts "* config.user.myvar_a is defined: %s" % [config.user.myvar_a]
else
puts "* config.user.myvar_a is NOT defined."
end
这是一种可接受的解决方法。