2014-01-16 56 views
0

是否有將此函數合併到一個語句中的方法?將兩個語句合併到一個Ruby中返回到一個

def test 
    err = _invalid_permission 
    return err if err # this statement 
    # do something else 
end 

我想:

def test 
    return (err = _invalid_permission) if err 
    # do something else 
end 

但這是不同的,errif後總是nil

或者這一個:

def test 
    return err if (err = _invalid_permission) 
    # do something else 
end 

但是這一次引起undefined local variable or method 'err'

解釋什麼,我試圖做的是要縮短這些種方法:

def test 
    err = _invalid_permission 
    return err if err 
    err = _check_another_error 
    return err if err 
    err = _and_another_one 
    return err if err 
    # and lots more 
    # do something else when not error 
    return nil 
end 

_invalid_permission_check_another_error_and_another_one將返回包含錯誤信息的非空字符串或數組或哈希。

另一個故事,下面看到的答案後,我認爲它可以組合成:

def test 
    err = _invalid_permission || 
    _check_another_error || 
    _and_another_one 
    # and lots more 
    return err if err 
    # do something else when not error 
    return nil 
end 
+2

我在考慮原件是相當不錯的,而且你擔心過早優化太多。其他人將是一個可讀性問題,並在條件測試中分配值會讓我大喊大叫。 –

+0

顯式優於隱式。 – squiguy

+0

這段代碼沒有任何意義。你想做什麼? – Chuck

回答

2
def test 
    (err = _invalid_permission) && return err 

    #do something else 
end 
+0

這個是美麗的^^謝謝,我使用:'err = _invalid_permission並返回錯誤' – Kokizzu

+2

@Kokizzu「美麗在計算中比任何其他技術都更重要,因爲軟件太複雜了,美麗是抵禦複雜性的最終防禦。 - David Gelernter – robertodecurnex

1

這工作,但你會犧牲清晰度

def test 
    (err = _invalid_permission) ? (return err) : nil 
    #do something 
end 
+1

作品,雖然有點奇怪:P – robertodecurnex

+0

代碼高爾夫總是很奇怪。 –

1
def test 
    (err = _invalid_permission) or begin 
    # do something else 
    end 
end 
+0

強制您將其餘代碼全部添加爲單個句子 – robertodecurnex

1

這沒有按」 t進入組合語句,但如果你想要做的是檢查你顯示的一堆錯誤條件,它可以更容易讀懂像這樣的東西:

def test 
    err ||= _invalid_permission 
    err ||= _check_another_error 
    err ||= _and_another_one 
    return err if err 
    #do a bunch of other stuff 
end 

或者,如果你在很多地方這樣做,這聽起來像一個異常可能是有道理的。例如:

class MyValidationError < Exception 
    attr_accessor :err 
    def initialize(err) 
    @err = err 
    end 
end 

def check(err_or_nil) 
    raise MyValidationError.new(err) if err_or_nil 
end 

def test 
    check _invalid_permission 
    check _check_another_error 
    check _and_another_one 
    #do a bunch of other stuff 
rescue MyValidationError 
    $!.err 
end 

但我認爲第一個是非常可讀的,親自。

2

您確定您提出了正確的問題嗎?你已經專注於一種方法來減少你必須編寫的代碼行。相反,你需要幹掉你的代碼。這裏有一種方法:

module Checks 
    def _invalid_permission() nil end 
    def _check_another_error() "oops!" end 
    def _and_another_one() nil end 
end 

class Doit 
    @@checks = Checks.instance_methods(false) 
    include Checks 

    def doit 
    @@checks.each { |m| rv = send(m); return rv if rv } 

    "test" 
    end 
end 

p Doit.new.doit # => "oops!" 

如果更改

def _check_another_error() "oops!" end 

def _check_another_error() nil end 

然後

p Doit.new.doit # => "test" 

這種方法還允許您添加,刪除或重命名的檢查方法而不必記住ch ange在別處引用它。

相關問題