在Ruby中,我试图编写一个使用变量的行(如果已经设置),否则默认为某个值:
myvar = # assign it to ENV['MY_VAR'], otherwise assign it to 'foobar'
我可以像这样编写这段代码:
if ENV['MY_VAR'].is_set? #whatever the function is to check if has been set
myvar = ENV['MY_VAR']
else
myvar = 'foobar'
end
但这是相当冗长的,我正试图以最简洁的方式编写它。我怎么能这样做?
答案 0 :(得分:61)
myvar = ENV['MY_VAR'] || 'foobar'
N.B。这有点不正确(如果哈希值可以包含值nil
),但由于ENV
只包含字符串,因此它可能已经足够了。
答案 1 :(得分:35)
普通哈希最可靠的方法是询问它是否有密钥:
myvar = h.has_key?('MY_VAR') ? h['MY_VAR'] : 'default'
如果您不关心nil
或false
值(即您希望将它们视为“不在那里”),那么undur_gongor的方法是好的(这也应该是正确的h
为ENV
):
myvar = h['MY_VAR'] || 'foobar'
如果你想允许nil
加入你的哈希,但假设它不存在(即nil
值与“不存在”相同)同时允许{{1你的哈希:
false
最后,它实际上取决于您的确切意图,您应该选择符合您意图的方法。 myvar = h['MY_VAR'].nil? ? 'foobar' : h['MY_VAR']
和if/else/end
之间的选择当然是品味问题,“简洁”并不意味着“字符数最少”,因此可以随意使用三元组? :
根据需要阻止。
答案 2 :(得分:20)
hash.fetch(key) { default_value }
如果值存在则返回值,如果该键不存在则返回default_value
。
答案 3 :(得分:4)
虽然它与您提供的具体示例无关,因为您确实在询问散列键而不是变量,但Ruby确实提供了检查变量定义的方法。使用defined?
关键字(它不是方法,而是关键字,因为它需要解释器进行特殊处理),如下所示:
a = 1
defined? a
#=> "local-variable"
@a = 2
defined? @a
#=> "instance-variable"
@@a = 3
defined? @@a
#=> "class-variable"
defined? blahblahblah
#=> nil
因此你可以这样做:
var = defined?(var) ? var : "default value here"
据我所知,这是除了丑陋的begin
/ rescue
/ end
块以外的唯一方法,以您要求的方式定义变量而不会冒着NameError的风险。正如我所说,这不适用于哈希:
hash = {?a => 2, ?b => 3}
defined? hash[?c]
#=> "method"
即。您正在检查方法[]
是否已定义,而不是您正在使用它访问的键/值对。
答案 4 :(得分:3)
这最适合我:
ENV.fetch('VAR_NAME',"5445")
答案 5 :(得分:2)
myvar = ENV.fetch('MY_VAR') { 'foobar' }
如果'foobar'
未设置,则 ENV['MY_VAR']
为默认值。
答案 6 :(得分:1)
另一种可能的替代方法,即使结果为ENV ['MY_VAR']为错误值,该替代方法仍然有效
myvar = ENV['MY_VAR'].presence || 'foobar'
答案 7 :(得分:0)
我写的Demand宝石使它变得极为简洁和干燥:
myvar = demand(ENV['MY_VAR'], 'foobar')
仅在存在ENV['MY_VAR']
时使用。也就是说,只要它为nil,空或仅包含空格的字符串,它就会将其丢弃,而使用默认值。
如果ENV['MY_VAR']
的有效值是虚假的(例如false
),或者无效值是真实的(例如""
),则使用||
这样的解决方案将无法正常工作。
答案 8 :(得分:-1)
myvar = ENV['MY_VAR'].is_set? ? ENV['MY_VAR'] : 'foobar'
这样你保留.is_set?方法。