2013-10-25 9 views
8

がある場合は、Rubyでこの行を短縮する方法はありますか? P場合bla_permission_invalidの内容はRubyの1行でreturn文

def bla_permission_invalid 
    return invalid_address_report_func if invalid_address? 
    return permission_error_report_func if @user.not_one_of? [ :group1, :group2 ] 
    return nil 
end 

invalid_adress_report_funcpermission_error_report_func返す文字列のようなもの

+4

このコードは、例外を改革しようとしているように見えますが... –

答えて

4

ある

def something # many things that like this 
    if (res = bla_permission_invalid).is_a? String then return res end 
    # do something else 
    return true 
end 

if (res = bla_permission_invalid).is_a? String then return res end 

ossible値はStringNilClassあり、その後、コードはこのように単純化することができます。

def something 
    res = bla_permission_invalid() 
    return res if res # strings are truthy, so they'll be returned but nil will proceed 

    # do something else 
    true 
end 
+0

ここで 'res'が繰り返されるので' res res'を置き換える方法はありますか? – hlcs

+0

@hlcs:私の頭の上から外れる - いいえ。 –

5
def something 
    bla_permission_invalid || (
    # do something else 
    true) 
end 
+0

あなたがここに 'return'は必要ありません。そして、私はこのようなコードブロックが読みにくいことがわかります。しかし、これは動作します。 –

+0

答えが – tihom

2

は楽しみのために、人はこのようなあなたのsomething方法を書き換えることができます:

def something 
    true.tap do 
    bla_permission_invalid.tap { |res| return res if res.is_a? String } 
    # do something else (thx Sergio) 
    end 
end 

しかし、もっと重要なのは、マーク・トーマスは、信用に値します彼の観察のために、手作業での問題は、カスタム例外を使用して解決する必要があります。

例外を持たない言語では、エラーコードの手法が優れています。 Rubyにはそれらがあります。

+0

"何か他のことをする"部分はどこですか? :) –

+0

例外はどのようにOOPの一部になりましたか? –

+0

@SergioTulentsev:私の頭の中ではすでに混乱しているし、ボウモアのボトルをまだ開けたこともありませんでした。 「元のコードでは、「教えてください、尋ねないでください」という原則に違反して、多くの質問をしています。これはOOPingで満足できるものです。2. Mark Thomasは死んでいますこれは例外の場合であるとの彼の観察 "、それは良いですか?私はあまりないと思う。生物学者として、私は単にプログラミングで十分なプロフェッショナルではない、あなたがCSを専攻して、私の気持ちを表現するのを助けてください! –

1

マークトーマスはすでにhis commentに記載されているように、何らかの文字列識別子を使用して自分でエラーを処理しようとしているようです。あなたが代わりに例外を使用することができます:bla_permission_invalidを呼び出すsomething上記のコードで

class AddressError < StandardError; end 
class PermissionError < StandardError; end 

def something 
    bla_permission_invalid 
    # do something 
    true 
end 

def bla_permission_invalid 
    raise AddressError if invalid_address? 
    raise PermissionError if @user.not_one_of? [ :group1, :group2 ] 
end 

を、その作業を実行し、trueを返します。 bla_permission_invalidで例外が発生した場合は、自動的に呼び出しスタックを伝播します。somethingから明示的に返す必要はありません。例外処理するには

begin 
    something 
rescue AddressError 
    # handle address error 
rescue PermissionError 
    # handle permission error 
end 
+0

そして、 'raise'には一般的な' fail'というエイリアスがあるので、 'raise AddressError if invalid_address?'の代わりに 'invalid_addressならAddressError'を失敗させることができます。 –