2013-07-20 35 views
2
class A 
    def numbers 
    [1,2,3,4] 
    end 

    def get_numbers(condition) 
    numbers = [3,5] if condition 
    numbers 
    end 
end 

a = A.new 
a.get_numbers(true) # [3,5] 
a.get_numbers(false) # nil 

我希望它在第二種情況下返回[1,2,3,4]Ruby實例方法&帶有相同名稱的條件局部變量賦值

P.S.我不是在尋找一個解決方案(我可以只有兩個不同的變量名稱來解決我的問題),而是我正在尋找這種行爲的解釋,是否紅寶石在運行期間創建變量numbers本身&初始化爲nil,因爲if條件?

+0

這是爲什麼downvoted?這是一個有效的問題... – Mischa

+0

@Mischa到底! –

回答

5

當令牌可以被解釋爲局部變量或方法調用時,局部變量具有優先權。方法定義中的最後一個numbers被解釋爲局部變量。爲了將它解釋爲一個方法調用,你需要明確它。

這可能是您的本意:

def get_numbers(condition) 
    return numbers = [3,5] if condition 
    numbers() 
end 

但是,這是很臭的代碼,它應該是這樣的:

def get_numbers(condition) 
    condition ? [3,5] : numbers 
end 
  • 是否紅寶石創建[創建]變量numbers在運行期間本身& [並]由於if條件初始化[初始化它]爲nil

是的。無論條件是否滿足,Ruby都將解析所有內容,並且如果因爲條件不滿足而未分配局部變量,則它將被初始化爲nil

+1

我懷疑是否使用三元語句改善了重命名變量的代碼或者如果/然後改變了常規。我會添加一些代碼來解釋。 –

+0

@theTinMan我不知道三元組是否比if-then好得多,但我認爲它比具有變量方法名稱崩潰要好得多。 – sawa

+0

我絕對同意。 –

3

@sawa有答案,但我建議對代碼做一點改變。我會去的:

def get_numbers(condition) 
    numbers = [3,5] if condition 
    numbers 
end 

要:

def get_numbers(condition) 
    return [3,5] if condition 
    numbers() 
end 

我想保持它的簡單,並讓代碼明顯。對本地變量的賦值完成任何操作,並且使用不帶空括號的方法名稱會令人困惑/隱藏它是方法調用。


寫代碼的另一種方法,就是完全可以接受的,就是:

def get_numbers(condition) 
    if condition 
    return [3,5] 
    else 
    numbers() 
    end 
end 

甚至:

def get_numbers(condition) 
    if condition 
    [3,5] 
    else 
    numbers() 
    end 
end 

編寫的代碼是所有關於獲得正確的答案,但關於能夠在六個月或一年內返回它,而不需要花費數小時來記住你所做的事情,或者更糟糕的是,爲什麼你這麼做了。其他人繼承我們的代碼,所以我們需要對我們在腦海中造成的破壞敏感,因爲當我們沒有寫清楚,乾淨和簡潔時。

+0

現在,由於您刪除了不必要的局部變量,因此您不需要再次將方法調用消除歧義給'numbers'。 – sawa

+0

感謝您的整齊解釋:) –

相關問題