Ruby:如果存在ENV变量,则使用最简洁的方法,否则使用默认值

时间:2011-10-05 18:58:57

标签: ruby hash

在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

但这是相当冗长的,我正试图以最简洁的方式编写它。我怎么能这样做?

9 个答案:

答案 0 :(得分:61)

myvar = ENV['MY_VAR'] || 'foobar'

N.B。这有点不正确(如果哈希值可以包含值nil),但由于ENV只包含字符串,因此它可能已经足够了。

答案 1 :(得分:35)

普通哈希最可靠的方法是询问它是否有密钥:

myvar = h.has_key?('MY_VAR') ? h['MY_VAR'] : 'default'

如果您不关心nilfalse值(即您希望将它们视为“不在那里”),那么undur_gongor的方法是好的(这也应该是正确的hENV):

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?方法。