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

And*_*rew 54 ruby hash

在Ruby中,我试图编写一个使用变量的行(如果已经设置),否则默认为某个值:

myvar = # assign it to ENV['MY_VAR'], otherwise assign it to 'foobar'
Run Code Online (Sandbox Code Playgroud)

我可以像这样编写这段代码:

if ENV['MY_VAR'].is_set? #whatever the function is to check if has been set
  myvar = ENV['MY_VAR']
else
  myvar = 'foobar'
end
Run Code Online (Sandbox Code Playgroud)

但这是相当冗长的,我试图以最简洁的方式编写它.我怎样才能做到这一点?

und*_*gor 70

myvar = ENV['MY_VAR'] || 'foobar'
Run Code Online (Sandbox Code Playgroud)

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

  • **这如何处理空字符串`""`?** 例如,如果我使用`MY_VAR=rails s`设置我的ENV变量,`myvar`会被设置为`""`还是会被设置为` “foobar”`? (2认同)
  • **答案:** 它将被设置为空字符串`""`。根据您的目的,这可能是您想要的结果。如果没有,您还可以使用 `ENV.key?( "MY_VAR" )` 来查看变量是否已设置? (2认同)

mu *_*ort 37

一般Hash最可靠的方法是询问它是否有密钥:

myvar = h.has_key?('MY_VAR') ? h['MY_VAR'] : 'default'
Run Code Online (Sandbox Code Playgroud)

如果你不关心nilfalse值(即你要正确对待他们一样的"不存在"),然后undur_gongor的做法是很好的(这时候也应该是罚款hENV):

myvar = h['MY_VAR'] || 'foobar'
Run Code Online (Sandbox Code Playgroud)

如果你想允许nil进入你的哈希,但假设它不存在(即一个nil值与"不存在"相同),同时允许false你的哈希:

myvar = h['MY_VAR'].nil? ? 'foobar' : h['MY_VAR']
Run Code Online (Sandbox Code Playgroud)

最后,它实际上取决于您的确切意图,您应该选择符合您意图的方法.选择之间if/else/end? :,当然的,口味的问题和"简洁"并不意味着"最少字符数"可以随意使用三元或if如所需的块.

  • @CanuckT `h` 是一个通用哈希,可以是任何哈希。我想我使用了“h”而不是“ENV”,因为“ENV”或它的行为方式没有什么特定的,它只是关于哈希值。 (2认同)

And*_*imm 23

hash.fetch(key) { default_value }
Run Code Online (Sandbox Code Playgroud)

如果值存在则返回值,default_value如果该键不存在则返回.

  • 或者`hash.fetch(key,default_value)`如果默认值不依赖于密钥. (8认同)
  • 我(和其他几乎所有人一样)倾向于忘记`fetch`甚至存在,所以+1使用整个API. (4认同)

小智 8

This works best for me:

ENV.fetch('VAR_NAME',"5445")
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的!那个怎么样?您能否编辑您的答案以告诉我们一些有关它的详细信息? (4认同)

Fir*_*shy 6

myvar = ENV.fetch('MY_VAR') { 'foobar' }
Run Code Online (Sandbox Code Playgroud)

'foobar'如果未设置则为默认值 ENV['MY_VAR']