2016-11-14 180 views
2

我今天在玩,意外地寫了這個,現在我很高興。發生病情時會發生什麼情況?

i = 101 
case i 
    when 1..100 
    puts " will never happen " 
    when i == 101 
    puts " this will not appear " 
    else 
    puts " this will appear" 
end 

ruby​​的內部處理方式when i == 101就像i == (i == 101)

回答

5

結構

case a 
    when x 
    code_x 
    when y 
    code_y 
    else 
    code_z 
end 

相同的計算結果爲

if x === a 
    code_x 
elsif y === a 
    code_y 
else 
    code_z 
end 

每個when調用的when參數的方法===,傳球case參數作爲參數(x === a是相同的x.===(a)) 。 ===方法與==稍有不同:它通常被稱爲「個案包容」。對於數字和字符串等簡單類型,它與==是一樣的。對於RangeArray對象,它是.include?的同義詞。對於Regexp對象,它與match非常相似。對於Module對象,它會測試參數是否爲該模塊的實例或其後代的一個實例(基本上,如果x === a,則爲a.instance_of?(x))。因此,在你的代碼,

if (1..101) === i 
    ... 
elsif (i == 101) === i 
    ... 
else 
    ... 
end 

執行幾乎同樣的測試,

if (1..101).include?(i) 
    ... 
elsif (i == 101) == i 
    ... 
else 
    ... 
end 

注意,這裏的case另一種形式的不使用===

case 
    when x 
    code_x 
    when y 
    code_y 
    else 
    code_z 
end 

這等同於

if x 
    code_x 
elsif y 
    code_y 
else 
    code_z 
end 
+1

讀者:如果你看到這個答案和我的一些相似之處,你應該知道我的原始答案是不正確的混亂,這並沒有被這個戴頭盔的Rubiest所忽略。在我完成編輯的同時,他提交了他的答案。 –

0

如果你when i == 101其等同於:

i == (i == 101) 

which for your code is equal to 

101 == true # false 

if you do the when case as follows: 

when i == 101 ? i : false 

它會進入到該塊段

i = 101 
case i 
    when 1..100 
    puts " will never happen " 
    when i == 101 ? i : false 
    puts " THIS WILL APPEAR " 
    else 
    puts " this will now NOT appear" 
end 
#> THIS WILL APPEAR 
+1

你應該使用一個proc代替,即'when - >(j){j == 101}' – Stefan

7

您的代碼就相當於:

if (1..100) === 101 
    puts " will never happen " 
elsif (101 == 101) === 101 
    puts " this will not appear " 
else 
    puts " this will appear" 
end 

如果我們看一下我們看到Range#===

(1..100) === 101 

等同於:

(1..100).include?(101) 
    #=> false 

(101 == 101) === 101簡化爲:

true === 101 

我們從文檔查看TrueClass#===這相當於:

true == 101 
    #=> false 

因此, else子句被執行。

相關問題