2014-11-17 21 views
5

Podczas czytania o Julii na http://learnxinyminutes.com/docs/julia/ natknąłem to:Wyjaśnienie ikona

# 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) 

Który Jestem pewien, jest doskonale dobre wyjaśnienie, jednak nie udało mi się uchwycić główne idea/korzyści.

Z tego co rozumiem do tej pory:

  1. Korzystanie z ikona w definicji funkcji pozwala nam określić, że nie mamy pojęcia, jak wiele argumentów wejściowych funkcja zostanie podana, może być 1, może być 1000 Naprawdę nie widzę korzyści z tego, ale przynajmniej rozumiem (mam nadzieję) koncepcję tego.
  2. Użycie splat jako argumentu wejściowego do funkcji powoduje ... Co dokładnie? I dlaczego miałbym go używać? Gdybym musiał wprowadzić zawartość tablicy do listy argumentów, użyłbym tej składni: some_array (:, :) (dla tablic 3D użyłbym some_array (:,:, :) itd.).

myślę jeden z powodów, dlaczego nie rozumiem to, że jestem zmaga się z definicji krotki i tablic, to krotki i typy danych (tablice jak Int64 jest to typ danych) w Julia? Czy są to struktury danych i jaka jest struktura danych? Kiedy słyszę tablicę, zazwyczaj myślę o matrycy 2D, być może nie najlepszym sposobem na wyobrazić tablice w kontekście programowania?

Zdaję sobie sprawę, że prawdopodobnie można napisać całe książki na temat struktury danych, a ja z pewnością mógłbym to zrobić w Google, jednak uważam, że ludzie o głębokim zrozumieniu tematu potrafią to wyjaśnić w dużo bardziej zwięzły sposób (i być może uproszczony), to powiedzmy, że artykuł wikipedia może, dlatego proszę was (i dziewczyny).

Odpowiedz

4

Wyglądasz dostajesz mechanizm i jak/co robią, ale mają trudności z tym, co go używać do. Rozumiem.

Uważam, że są one użyteczne w sytuacjach, w których potrzebuję przekazać nieznaną liczbę argumentów i nie chcę zawracać sobie głowy budowaniem tablicy przed przekazaniem jej podczas interaktywnej pracy z tą funkcją.

na przykład:

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) 

więc kilka rzeczy, aby pamiętać. Splat pozwala na przekształcenie iteracji w tablicę i odwrotnie. Zobacz powyższy bit [urls...]? Julia zamienia to w wektor z rozwiniętą krotką, która okazuje się znacznie bardziej użyteczna niż kłótnia w moim doświadczeniu.

To tylko jeden przykład tego, gdzie okazały się dla mnie przydatne. Korzystając z Julii, możesz natknąć się na więcej.

Głównie służy do projektowania api, które są naturalne w użyciu.

+0

Wielkie dzięki :) – kip820

-1

Ikony wymagają znajomości parametrów; korzyścią jest raczej niż przekazywanie wartości/zmiennych dla każdego z parametrów, które można przekazać pojedynczej zmiennej, która ma właściwości reprezentujące każdy z wymaganych parametrów.

Podstawowe zalety to mniej pisanie na klawiaturze i lepsza czytelność.

np. (PowerShell)

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

vs

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