[英]Number of arguments in a ruby block
我是Ruby的新手,但不是那種允許lambda的語言,比如groovy。 所以我看到了這個例子:
myArray.product(otherArray).reject{|i,j| i > j}
在一個ruby代碼塊中,我之前沒有看過這個塊接受2個參數,但是當我去查看文檔時,我只能看到文檔說它需要1個參數。 我對enumerable
類看了同樣的東西,但是這個doc也只顯示了1個參數。
我知道它有效,我想我希望有一種更簡單的方法來確定除了猜測和測試方法之外需要多少個參數。 如何判斷一個塊在Ruby中有多少參數?
這是有效的,因為Ruby支持解構。
解構允許您將一組變量綁定到相應的值集合,您通常可以將值綁定到單個變量。
這允許以下內容成立:
arr = [1, 2]
x = arr
x == [1, 2] # true
y, z = arr
y == 1 # true
z == 2 # true
您可以從以下代碼中看到,塊的參數中的解構對於采用塊的內置方法不是唯一的:
def my_method(arr)
yield arr
end
my_method([1, 2, 3]) {|x| puts x.inspect }
# => [1, 2, 3]
my_method([1, 2, 3]) {|x, y, z| puts x.inspect }
# => 1
您可以在塊參數中進行一些有趣的重組,具體取決於數組的結構:
[[1, 2], [3, 4], [5, 6], [7, 8]].reject {|x,y| y == 8 }
#=> [[1, 2], [3, 4], [5, 6]]
您可以將它們分組在括號中:
[ [[1,2],3], [[1,3],6] ].select {|(x,y),z| x == 1 && z == 3 }
#=> [ [[1,2],3] ]
您還可以使用splat運算符執行各種操作,例如處理可變長度子數組:
[[:a,:b,2,3,4,5,6], [:c,:d,7,8,9]].each {|x,y,*numbers| puts numbers.inspect }
#=> [2,3,4,5,6]
#=> [7,8,9]
Ruby在解釋參數方面很靈活; 這是一個類似的例子,有一個然后是兩個參數:
[1, 3].product([2, 4]).reject {|a| a.first > a.last }
=> [[1, 2], [1, 4], [3, 4]]
[1, 3].product([2, 4]).reject {|a,b| a > b }
=> [[1, 2], [1, 4], [3, 4]]
這里的經驗法則是,您可以將參數視為復合對象,也可以視為集合中的單個元素。 例如,
[1, 2, 3].tap {|a,b,c| puts [a,b,c].inspect }
[1, 2, 3]
...
[1, 2, 3].tap {|a,b| puts [a,b].inspect }
[1, 2]
...
[1, 2, 3].tap {|a| puts a.inspect }
[1, 2, 3]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.