2013-10-25 82 views
8

有沒有辦法在Ruby上縮短這一行?Ruby一行如果返回語句

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

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 

時bla_permission_invalid的內容是類似

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

如果p 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 if 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:事情已經在我的腦海中變得混亂了,我甚至沒有打開那個Bowmore瓶。如果我通過這樣的說法來分開陳述:1.「原始代碼提出太多問題,違反'告訴,不問'原則,這可以通過更多的OOP來滿足」,以及2.「馬克托馬斯死於他認爲這是例外情況「,這是否更好?我估計不多。作爲一名生物學家,我在編程方面根本不夠專業,你們CS專業,請幫助我表達我的感受! –

1

馬克托馬斯已在his comment注意到,它看起來像你試圖自己使用某種字符串標識符來處理錯誤。你可以使用異常,而不是:

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 

在上面的代碼中調用somethingbla_permission_invalid,執行其工作,並返回true。如果bla_permission_invalid中發生異常,它會自動向上傳播調用堆棧,您不必從something明確返回它。

來處理異常:

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

然後讓我評論一下,'raise'有一個流行的別名'fail',所以如果invalid_address ?,而不是'raise AddressError',我們可以'如果invalid_address?失敗AddressError''。 –