a此方法應回傳和b(未排序)之間的所有數字的總和,如果它們相等,則應回傳a或。b
def get_sum(a,b)
a < b ? (a..b).sum : (b..a).sum
end
我很好奇為什么這個方法在a和b相等時不回傳 nil 。三元運算子負責a小于或大于的條件,b因此我很想return a if a==b在三元之前添加以測驗它們是否相等,但似乎沒有必要。
例如, ifa=5和b=5then 回傳的值為5. 有人可以解釋為什么會這樣嗎?
uj5u.com熱心網友回復:
這就是<運算子(或更確切地說是方法)的作業方式。
a < b
true如果a小于則回傳b,否則回傳false。
因此5 < 5回傳false。
通過撰寫a..b,您創建了一個Range物件Range.new(a, b),該物件從 開始a并上升到b. 之后你呼叫sum這個物件的方法。
由于范圍5..5從5to 和包括5,當您將其轉換為陣列時,您會得到:
(5..5).to_a #=> [5]
該sum方法將所有在此范圍內的數字相加。并且由于該范圍包括單個數字5,因此該操作的結果是5。
(5..5).sum #=> 5
你的方法可以寫得更簡潔
def get_sum(a, b)
(a < b ? a..b : b..a).sum
end
要使其0在a和b相同時回傳,您可以使用具有三個點的獨占...范圍。
def get_sum(a, b)
(a < b ? a...b : b...a).sum
end
get_sum(5, 5) #=> 0
get_sum(5, 6) #=> 5
get_sum(5, 7) #=> 11
uj5u.com熱心網友回復:
實際上沒有Range#sum,因為它是繼承自Enumerable#sum
所以(5..5).sum它是一樣的(5..5).to_a.sum
(5..5).to_a # => [5]
這就是原因
要修復它,您可以執行以下操作(else將三元運算子的分支更改為elsif)
def get_sum(a, b)
if a < b
(a..b).sum
elsif a > b
(b..a).sum
end
end
get_sum(1, 2) # => 3
get_sum(2, 1) # => 3
get_sum(5, 5) # => nil
但在我看來get_sum(5, 5) == 5比nil
uj5u.com熱心網友回復:
三元運算子只有兩個分支。如果條件不真實,則執行后者。沒有不執行分支的情況(除非發生一些錯誤,但這是另一種情況)。
只有當你只有一個分支并且沒有執行時,你才會得到 nil 。例如
def get_sum(a,b)
if a < b
(a..b).sum
end
end
為此get_sum(5, 5)評估為nil
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508359.html
