2012-05-10 15 views
0

私は私が書いたこれを行うには""レスキューステートメントを強制的に失敗させることは可能ですか?

に設定されていない何かを探して、いくつかの異なる属性を巡回しています:

基本的に
def email 
    begin 
    if email1 != "" 
     email1 
    elsif email2 != "" 
     email2 
    elsif email3 != "" 
     email3 
    else 
     Fail 
    end 
    rescue 
    "Undefined" 
    end 
end 

、それが最初の文にロジックを失敗した場合、私がしたいですそれは救助されるべきです。

おそらく、救助は正しい決定ではありません。あなたは何をお勧めします?

+0

予想される入出力についてさらに詳しく説明することなく、より良いものを推薦するのは難しいです。 –

答えて

2

まず第一に、defが暗黙のbeginですので、あなたができますあなた自身を救いなさい。しかし、あなたの限られた記述から、私はこれがあなたのために働くべきだと思う:

[email1, email2, email3].reject(&:empty?).first || "undefined" 

これが第1の設定、電子メールアドレスまたは「未定義」を返すのいずれか。私のバージョンでは、問題を説明する方法(最初の電子メールアドレスを取得するか「未定義」を返す)のようにもう少し読みますが、muのバージョンは少しコンパクトで、おそらく私が使用するものです。

3

あなたはrescueが発生する場合は、例外を発生させる必要がある -

def email 
    begin 
    raise StandardError if email1.empty? 
    rescue StandardError 
    # do something 
    end 
end 
+0

それはここでは制御の流れに例外が使われているように思えますが、これは一般的には良いことではありません。 –

+0

私はアンドリューに同意します。この時点でもっと好奇心が溢れています。次の救助に行くために声明を失敗させるにはどうすればいいですか – Trip

+0

それは本当です。おそらく 'else'がここでのより良い解決策です。質問された質問に答えるだけでした。 – x1a4

1

おそらく救助が正しい判断ではありません。あなたは何をお勧めします?

あなたが正しいです、rescueは正しい決定ではありません。例外は例外的な条件であり、ローカルフロー制御ではありません。私はfindを使用したい:

def email 
    [email1, email2, email3, 'Undefined'].find { |s| !s.empty? } # or != '' if nils might be present 
end 

あるいは、Railsの(またはその一部)が周りにいたならば、あなたはこれを言うことができます:

def email 
    [email1, email2, email3, 'Undefined'].find(&:present?) 
end 
関連する問題