2

私のメソッドは、 とexist­s_elseの 2 つのパラメーターを取ります。である場合は、 を返します。そうでない場合は、 を返します。を呼び出すと、が返されます。basefallbackbasenilfallbacknilbaseexist­s_else(true, false)true

標準的なifステートメントを使用すると、次のtrueように返されます。

def exist­s_else(bas­e, fallb­ack)
  unless base.­nil?
    base
  else
    fallb­ack
  end
end

a = true
exists_els­e( a, false­ )
# => true

以下に示すインライン実装を使用すると、 が返されますfalse

def exist­s_else(base, fallback)
  base unles­s base.nil­? else fallback
end

a = true
exists_els­e( a, false­ )
# => false

falseインライン実装で返されるのはなぜですか?

4

3 に答える 3

6

というあなたの主張

base unles­s base.nil­? else fallback

unlessは、長い形式のステートメントと同等であると想定されていますが、正しくありません。else実際、 post 条件内では使用できません。Ruby はコードを次のように解釈しています。

def exist­s_else(base, fallback)
  base unles­s base.nil­?
else fallback
end

これ (または質問のように改行なしのバージョン) を IRB に入力すると、Ruby は次の警告を表示します。

warning: else without rescue is useless

つまり、Ruby は、を次のelseように例外処理コードの一部として解釈しようとしています。

def exists_else(base, fallback)
  base unless base.nil
rescue ArgumentError => e
  # code to handle ArgumentError here
else
  # code to handle other exceptions here
end
于 2013-09-09T05:03:27.910 に答える
4

else1 行で実行しようとしている場合、ステートメントを使用することはできません。elseが必要な場合は、拡張バージョンを使用する必要があります。

elseこの場合の はエラーハンドリングに関係しているとRubyは考えています。最初のunless-end方法に固執する必要があります。

于 2013-09-09T05:03:19.687 に答える
1

true/false チェックを評価するには、次の構文を好みます。

condition(s) ? true_value : false_value

あなたの場合、次のようになります。

def exists_else(base, fallback)
  base.nil? ? fallback : base
end

a = true
puts exists_else(a, false)  # => true
于 2013-09-09T15:01:30.757 に答える