11

http://learnxinyminutes.com/docs/julia/でジュリアについて読んでいるときに、私はこれに出くわしました:

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

これは完全に良い説明だと確信していますが、主なアイデア/利点を理解できません。

私がこれまでに理解したことから:

  1. 関数定義でスプラットを使用すると、関数に与えられる入力引数の数がわからないことを指定できます。1 かもしれないし、1000 かもしれません。これの利点は実際にはわかりませんが、少なくとも私は理解しています (私は願っています)これのコンセプト。
  2. 関数への入力引数としてスプラットを使用すると... 正確には何ですか? そして、なぜ私はそれを使うのですか?配列の内容を引数リストに入力する必要がある場合は、代わりに次の構文を使用します: some_array(:,:) (3D 配列の場合、some_array(:,:,:) などを使用します)。

これが理解できない理由の一部は、タプルと配列の定義に苦労していることだと思います.タプルと配列のデータ型です(Int64はデータ型です)。それともデータ構造で、データ構造とは何ですか? 配列と聞くと、通常は 2D 行列を思い浮かべますが、プログラミングのコンテキストで配列を想像するのに最適な方法ではないでしょうか?

おそらくデータ構造とは何かについての本を一冊書けるだろうし、Google で検索することもできるだろうが、主題を深く理解している人はそれをもっと簡潔に (そしておそらく単純化して) 説明できることがわかった。それでは、ウィキペディアの記事が可能であるとしましょう。

4

1 に答える 1

12

メカニズムとその仕組みとその機能は理解できているようですが、それを何に使用するかについては苦労しています。わかりました。

不明な数の引数を渡す必要があり、関数を対話的に操作するときに渡す前に最初に配列を構築する必要がないようにする場合に便利です。

例えば:

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)

そのため、注意すべき点がいくつかあります。スプラットを使用すると、イテラブルを配列に変換したり、その逆を行うことができます。[urls...]上のビットを参照してください。Julia は、それを urls タプルが展開された Vector に変換します。これは、私の経験では、引数のスプラッティング自体よりもはるかに便利であることが判明しました。

これは、それらが私にとって有用であることが証明された場所の 1 つの例にすぎません。julia を使用すると、さらに多くのことがわかります。

これは主に、自然に使用できる API の設計を支援するためにあります。

于 2014-11-18T00:01:58.450 に答える