En introduktion til Ruby's * Splat og double ** Splat-operatører

En introduktion til Ruby's * Splat og double ** Splat-operatører

Har du nogensinde ønsket at definere en metode uden at vide, hvor mange argumenter der skal til? Bruger du lange rastløse nætter, der ønsker, at der var en nem måde at adskille en liste i en hash? Du behøver ikke lede længere end Rubys splatoperatører! Der er så mange gode ting, du kan gøre med disse, men jeg vil bare gå over det grundlæggende plus et par pæne tricks, jeg har opdaget.

Enkelt * Splat

Splatoperatøren har næsten uendelige anvendelser. Men hovedideen er, at når du ikke ønsker at specificere antallet af argumenter, du har, vil du bruge en splat-operator. Det enkleste eksempel ville være noget som dette:

En anden nyttig ting er, at splatoperatøren kan lave en matrix i flere argumenter:

arr = ["first", "second", "third"]def threeargs(*arr)#makes three arguments

Du kan også bruge splat-operatøren til at få fat i ethvert segment af en matrix:

first, *rest, last = ["a", "b", "c", "d"]p first # "a"p rest # ["b", "c"]p last # "d"

Du vil bemærke, at restvariablen stadig er en matrix, hvilket er super praktisk. Efter det sidste eksempel kan du stadig gøre ting som dette:

first, *rest, last = ["a", "b", "c", "d"]p rest[0] # "b"

Det er det grundlæggende i single splat-operatøren, men jeg opfordrer dig til at rode mere med det. Det kan gøre ting som at kombinere arrays, forvandle hashes og strings til arrays eller trække genstande ud af en matrix!

Dobbelt ** Splat

Den dobbelte splat-operatør kom tilbage i Ruby 2.0. Det ligner den oprindelige splat med en forskel: det kan bruges til hashes! Her er et eksempel på den mest basale brug af en dobbelt splat.

def doublesplat(**nums) p **numsenddoublesplat one: 1, two: 2 # {:one=>1, :two=>2}

Samler det hele

Jeg håber, du kan se, at mulighederne er ret uendelige med at bruge disse to sammen. Det vigtigste at huske på er, at du bruger splats som en parameter i en metode, når du er usikker på, hvor mange argumenter den metode vil bruge.

Endelig lavede jeg en lille funktion, der viser, hvordan du kan filtrere ethvert argument, der ikke er et nøgleværdipar, ved hjælp af både en enkelt splat og dobbelt splat.

def dubSplat(a, *b, **c) p cenddubSplat(1,2,3, 4, a: 40, b: 50)#{:a=>40, :b=>50}

Tak for læsningen, og prøv nu at lege med det selv!