2016-09-14 212 views
1

我正在處理一個項目,其中有幾個我不熟悉的以下模式的實例。我不知道該怎麼稱呼它,所以我找不到任何文檔。以下是什麼概念?有條件的紅寶石分配

if [email protected] = [nil, 2].sample 
    puts 'there was an error' 
else 
    puts @two 
end 

感謝

+3

請儘量避免雙重否定。將其轉化爲一個積極的測試,並且顛倒「puts」語句的順序會使這更加明智。如果你不小心,最終可能會出現三重和四重底線,這些都是真正的頭腦風暴。 – tadman

+0

這是可怕的代碼。除了@ tadman的評論之外,這還不是很清楚:'@two = [nil,2] .sample;放@two? @two:「出現錯誤」。 –

+0

更好的辦法是編寫一個類似'def coin_flip; [:heads,:tails] .sample; end'然後是'if(coin_flip ==:heads)',它表達了更多這裏發生的事情。 – tadman

回答

2

它基本上斜靠在Ruby的falsy對象:nilfalse

在Ruby中,除nilfalse之外的所有內容都被稱爲truthy

因此,在例如其打印的@two值,如果它是truthy(2),否則(nil)它則輸出錯誤消息。

我不認爲這個「概念」有一個名字。

+0

「如果真的是真的......」這是否意味着如果右側的任務是真的? –

+0

@JoeEssey你在這兩種情況下抨擊'@ two'。這是分配的值的問題 - 真理('2')或者虛假('nil') –

1

這裏沒有什麼特別,它是等效於:

@two = [nil, 2].sample 

if [email protected] 
    puts 'there was an error' 
else 
    puts @two 
end 

@two = [nil, 2].sample[nil, 2]返回一個隨機元素,即或者nil2,並將其分配給該實例變量@two

條件應該是不言自明的。

1

使用條件賦值表達式的值並沒有真正有一個本身,而是包裹在括號中分配的做法稱爲"Safe assignment in condition",這是你應該採取,如果事情的做法你正在編寫這樣的代碼。

+0

這就是我正在尋找的東西。我測試了它,它工作,但它似乎剛剛關閉。很高興看到風格指南解決這個問題。 –