2011-10-05 15 views
32

を使うそうでない場合、変数を使用するのが最も簡潔な方法は、私はいくつかの値をデフォルトとそうでない場合、それが設定されている場合、変数を使用して行を記述しようとしています:ルビー:それが存在する場合は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

MY_VAR = ""の場合はどうなりますか? – tokland

答えて

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

N.B.これは若干不正です(ハッシュに値nilが含まれている場合)が、ENVには文字列だけが含まれているので、それで十分でしょう。

-1

myvar = ENV['MY_VAR'].is_set? ? ENV['MY_VAR'] : 'foobar'

あなたが.is_setを保つこの方法はありますか?方法。

+0

'is_set? 'はルビメソッドですか?私が求めていた方法の名前が分からなかったので、私はそれを作ったと思った。 – Andrew

+0

少なくとも私のバージョンのrubyにはis_setはありませんか?ENV.has_keyがありますか? –

28

一般的なハッシュのための最も確実な方法は、それが鍵を持っているかどうか尋ねることです:

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

あなたはおよそnilまたはfalse値を気にしない場合(つまり、あなたがそれらを」と同じように扱いたいですではないが」)、そしてundur_gongorのアプローチが良いです(これもh)がENVときに問題ないはずです。

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

そして、あなたはあなたのハッシュにあるが、それは存在しないふりをするnilを許可する場合(つまり、 nil値は、同じあなたのハッシュでfalseを可能にしながら)「ではないが」のようになります。それは本当にあなたの正確な意図に依存して終わりで

myvar = h['MY_VAR'].nil?? 'foobar' : h['MY_VAR'] 

、あなたの意図に合ったアプローチを選択する必要があります。 if/else/end? :の間の選択は勿論味覚の問題であり、「簡潔」は「文字の数が最小」を意味するものではないので、3進またはifブロックを自由に使用してください。

+0

+1:すべてをカバーする回答。 –

+0

Dittos @undur_gongor。徹底してくれてありがとう! – theUtherSide

17

存在する場合は値を返し、キーが存在しない場合はdefault_valueを返します。

+7

デフォルトがキーに依存しない場合、 'hash.fetch(key、default_value)'。 –

+0

@muが短すぎます:はい。通常は 'hash.fetch(key){raise"#{key.inspect}は存在しません! " } '、私は100%2つのパラメータがあるとき正しい順序の確かではなかった。 –

+3

私は(ほぼ他の人のように) 'fetch'も存在することを忘れる傾向があります。 –

2

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/ブロックは、NameErrorを危険にさらすことなく尋ねる方法で変数を定義するブロックです。私が言ったように、これはハッシュには適用されません。

hash = {?a => 2, ?b => 3} 
defined? hash[?c] 
    #=> "method" 

アクセスするために使用しているキーと値のペアではなく、[]というメソッドが定義されていることを確認しています。 ENV['MY_VAR']が設定されていない場合は、デフォルトであること

0
myvar = ENV.fetch('MY_VAR') { 'foobar' } 

'foobar'

関連する問題