2014-11-17 25 views
5

Durante la lettura di Julia sul http://learnxinyminutes.com/docs/julia/ mi sono imbattuto in questo:Spiegazione di splat

# You can define functions that take a variable number of 
# positional arguments 
function varargs(args...) 
    return args 
    # use the keyword return to return anywhere in the function 
end 
# => varargs (generic function with 1 method) 

varargs(1,2,3) # => (1,2,3) 

# The ... is called a splat. 
# We just used it in a function definition. 
# It can also be used in a fuction call, 
# where it will splat an Array or Tuple's contents into the argument list. 
Set([1,2,3]) # => Set{Array{Int64,1}}([1,2,3]) # produces a Set of Arrays 
Set([1,2,3]...) # => Set{Int64}(1,2,3) # this is equivalent to Set(1,2,3) 

x = (1,2,3)  # => (1,2,3) 
Set(x)   # => Set{(Int64,Int64,Int64)}((1,2,3)) # a Set of Tuples 
Set(x...)  # => Set{Int64}(2,3,1) 

che sono sicuro che è una perfetta buona spiegazione, ma non riesco a cogliere le principali Idea/benefici.

Da quello che ho capito finora:

  1. Utilizzo di un simbolo in una definizione di funzione ci permette di specificare che non abbiamo alcuna idea di come molti argomenti di input sarà data la funzione, potrebbe essere 1, potrebbe essere di 1000 Non vedo davvero il beneficio di questo, ma almeno capisco (spero) il concetto di questo.
  2. Utilizzare uno splat come argomento di input per una funzione fa ... Che cosa esattamente? E perché dovrei usarlo? Se dovessi inserire il contenuto di una matrice nella lista degli argomenti, userei questa sintassi: some_array (:, :) (per gli array 3D vorrei usare some_array (:,:, :) ecc.).

Credo che parte del motivo per cui non capisco questo è che sto lottando con la definizione di tuple e array, sono tuple e tipi di matrici di dati (come Int64 è un tipo di dati) a Julia? O sono strutture di dati e cos'è una struttura di dati? Quando ascolto array di solito penso a una matrice 2D, forse non è il modo migliore di immaginare gli array in un contesto di programmazione?

Mi rendo conto che potresti probabilmente scrivere interi libri su cosa sia una struttura dati, e potrei sicuramente Google, tuttavia trovo che le persone con una profonda comprensione di un argomento sono in grado di spiegarlo in un modo molto più succinto (e forse semplificato), quindi diciamo che l'articolo di wikipedia potrebbe, ed è per questo che ti sto chiedendo ragazzi (e ragazze).

risposta

4

Sembri si ottiene il meccanismo e come/cosa fanno, ma sono alle prese con quello che si potrebbe utilizzare per. Ho capito.

Li trovo utili per le cose in cui ho bisogno di passare un numero sconosciuto di argomenti e non voglio avere la briga di costruire un array prima di passarlo quando si lavora con la funzione in modo interattivo.

per esempio:

func geturls(urls::Vector) 
    # some code to retrieve URL's from the network 
end 
geturls(urls...) = geturls([urls...]) 

# slightly nicer to type than building up an array first then passing it in. 
geturls("http://google.com", "http://facebook.com") 

# when we already have a vector we can pass that in as well since julia has method dispatch 
geturls(urlvector) 

Quindi un paio di cose da notare. Splat ti consente di trasformare un iterabile in un array e viceversa. Vedi sopra il numero [urls...]? Julia lo trasforma in un vettore con la tupla di urls espansa che risulta essere molto più utile dell'argomento che si spicca nella mia esperienza.

Questo è solo un esempio di dove si sono rivelati utili per me. Mentre usi julia, ne troverai di più.

È principalmente lì per aiutare a progettare le API che sono naturali da usare.

+0

Grazie mille :) – kip820

-1

Gli splats richiedono di conoscere i parametri; il vantaggio è piuttosto che passare valori/variabili per ciascuno dei parametri è possibile passare una singola variabile che ha proprietà che rappresentano ciascuno dei parametri richiesti.

I principali vantaggi sono una minore digitazione e una migliore leggibilità.

ad es. (PowerShell)

$credentials = get-credential 
$x = Test-Credential -username $credentials.Username -password $credentials.Password 

vs

$credentials = get-credential 
$x = Test-Credential @credentials