2013-04-04 31 views
2

如果表達式爲空,您能解釋在「elsif」中使用ruby是什麼表達式嗎?elsif部分中的空條件

arg = 3 
if (arg == 1) 
    puts "1" 
elsif (arg == 2) 
    puts "2" 
elsif 
    puts "3" 
end 

p (1...10).map { |i| 
    if (i == 1) 
    1 
    elsif (i == 2) 
    2 
    elsif 
    3 
    end 
} 

腳本輸出:

3 
[1, 2, nil, nil, nil, nil, nil, nil, nil] 

回答

4

基本上沒有多說:

if-else分支,每當有比賽的條件已經發現,已經歸還,則匹配條款的最後聲明由if-else塊。考慮以下:

arg = 4 
p m = if (arg == 1) 
    "1" 
elsif (arg == 3) 
    "3" 
elsif (arg ==4) 
    "5";"11" 
elsif 
    "3" 
end 

輸出:

#11 

但是與每個條規則時,如果發現有任何裸露elsif然後if-else塊檢查其直接表達的真值,並相應地返回的值:

arg = "4" 
p m = if (arg == "1") 
    47 
elsif 
    10 ; "7" 
elsif (arg =="5") 
    12;14 
elsif 
    2 
end 

O本安輸出:

#"7" 

下面的代碼將返回nil一樣沒事就回來作爲10作爲條件檢查,在代碼後一無所獲。所以nil已經退回。

arg = "4" 
p m = if (arg == "1") 
    47 
elsif 
    10 
elsif (arg =="5") 
    12;14 
elsif 
    2 
end #nil 

另一個代碼下面把事情終於明白:

arg = "4" 
p m = if (arg == "1") 
    47 
elsif 
    nil 
elsif (arg =="5") 
    12;14 
elsif 
    2 ; "44" 
end #44 

與所有的例子說,上面我希望的原因很清楚爲什麼 - 下面的代碼輸出:[1, 2, nil, nil, nil, nil, nil, nil, nil]

p (1...10).map { |i| 
    if (i == 1) 
    1 
    elsif (i == 2) 
    2 
    elsif 
    3 
    end 
} 

要回答你的第一個代碼,首先看看下面的兩個:

m = if puts "hi" 
p "hello" 
end #"hi" 

「hi」打印爲puts返回nil其中if子句評估爲false因此hello未打印。但下面的代碼的確如p那裏使用,並且if子句在p返回值true上執行。

m = if p "hi" 
p "hello" 
end 

#"hi" 
#"hello" 

希望現在你明白了爲什麼3即將從下面的代碼輸出,從應用作爲一個整體的所有邏輯以上:你的意思是你

arg = 3 
if (arg == 1) 
    puts "1" 
elsif (arg == 2) 
    puts "2" 
elsif 
    puts "3" 
end 
+0

有趣的是,該任擇議定書的第二個例子,除此之外的情況下返回nill的原因,是因爲它的治療3,如有條件進入一個空塊。而在第一個print語句作爲條件打印出來的值,但仍返回零 – Mgrandjean 2013-04-04 16:14:28

+1

@Mgrandjean執行是的,你是正確的。 – 2013-04-04 16:29:02

+0

謝謝你,幫了我很多。 – 2013-04-04 16:31:34

0

假設想知道的元素你「再迭代是空白的,而這只是一個秋天通過對具有不匹配的先前評價:

elsif i.blank? 

如果你想有一個包羅萬象的,那麼就使用:

else 
2

如果在同一行上沒有表達式,則將使用來自下一行的表達式作爲條件。你不能有一個空的表達式。

你的第一個例子是相同的:

arg = 3 
if (arg == 1) 
    puts "1" 
elsif (arg == 2) 
    puts "2" 
elsif puts "3" # puts is the condition 
    #empty 
end 

無論是第一或第二條件是真實的,因爲puts returns nil也不是最後一個。然而puts顯示它的參數返回nil之前,所以你仍然可以看到3輸出。

同樣,你的第二個例子是等價於:

p (1...10).map { |i| 
    if (i == 1) 
    1 
    elsif (i == 2) 
    2 
    elsif 3 
    nil #nil is the default if no result is specified 
    end 
} 

由於在Ruby中任何不falsenil在條件計算結果爲true,最後elsif結果始終爲true(3不虛假或無),並且有效地像普通的else一樣行事。如果沒有指定,則返回的默認值爲nil,所以您在結果中看到nil