我們都知道憔狞,Ruby 支持多種傳參方法蝴悉,最常見的就是必選參數(shù),可選參數(shù)瘾敢,帶默認(rèn)值的參數(shù)以及命名參數(shù)拍冠。
舉個(gè)例子:
def mm a, b=2, *c
p [a, b, c]
end
這個(gè)方法定義了一個(gè)必選參數(shù),一個(gè)帶默認(rèn)值的參數(shù)以及一個(gè)可選參數(shù)簇抵,讓我們運(yùn)行這個(gè)方法試試:
mm(1) # => [1, 2, []]
mm(1,10) # => [1, 10, []]
mm(1, 10, 20, 21) #=> [1, 10, [20, 21]]
再來讓我們?cè)囋嚸麉?shù):
def nn a: 3, b: 4
p [a, b]
end
然后來運(yùn)行一下:
nn # => [3, 4]
nn(a: 10) # =. [10, 4]
然而有這么一種情況:我們想使用命名參數(shù)庆杜,但又不想提供默認(rèn)值,即調(diào)用函數(shù)時(shí)必須傳入該參數(shù)碟摆,這個(gè)時(shí)候該怎么辦呢晃财?
讓我們來看看下面這個(gè)函數(shù):
def special(a:, b:2)
p [a, b]
end
注意,第一個(gè)參數(shù) a 后面沒有任何值典蜕,這看起來視乎有點(diǎn)怪異断盛,那我們來測(cè)試一下:
special b: 4 # => ArgumentError: missing keyword: a
special a: 12, b: 10 #=> [12, 10]
special 12, b: 10 # => ArgumentError: wrong number of arguments (given 1, expected 0)
大家可以發(fā)現(xiàn), a 是一個(gè)必選參數(shù)嘉裤,并且傳參的時(shí)候也必須以哈希的方式傳入郑临。這種傳參方式比較少見栖博,但確實(shí)適用于想用命名參數(shù)方式傳參又要強(qiáng)迫調(diào)用者必須傳入該參數(shù)的情況屑宠。這個(gè)小技巧大家 get 到了嗎?