Julia mengizinkan definisi fungsi dan metode dengan argumen yang tidak disebutkan namanya.

Ini tidak disebutkan dalam dokumentasi fungsi, juga tidak dibahas secara eksplisit dalam dokumentasi metode. Sebagai contoh:

function myfunc(::Int)
    println("Hello!")
end

Bagaimana saya harus menggambarkan perilaku ini (saya telah mencari "argumen anonim" di Google tanpa hasil), dan kapan itu berguna?

2
btimar 13 Agustus 2019, 18:15

1 menjawab

Jawaban Terbaik

Perilaku ini berguna untuk pengiriman metode, ketika Anda hanya peduli tentang tipe argumen bukan nilai argumen. Paling sering ini adalah kasus ketika apa yang Anda kirim adalah tipe tunggal.

Contohnya adalah:

julia> Vector{String}(undef, 3)
3-element Array{String,1}:
 #undef
 #undef
 #undef

Fungsi ini didefinisikan dengan cara berikut:

Array{T,1}(::UndefInitializer, m::Int) where {T} =
    ccall(:jl_alloc_array_1d, Array{T,1}, (Any, Int), Array{T,1}, m)

Dan Anda dapat melihat bahwa kami hanya peduli bahwa argumen pertama bertipe UndefInitializer, yang selanjutnya didefinisikan sebagai:

struct UndefInitializer end
const undef = UndefInitializer()

Kami melihat bahwa UndefInitializer adalah tipe tunggal, jadi kami tidak peduli dengan nilai variabel tipe ini, tetapi hanya tentang tipenya.

Tipe singleton umum lainnya di Base adalah Missing. Berikut adalah contoh definisi dari Basis fungsi standar yang mendapatkan Missing sebagai argumen:

for f in (:(acos), :(acosh), :(asin), :(asinh), :(atan), :(atanh),
          :(sin), :(sinh), :(cos), :(cosh), :(tan), :(tanh),
          :(exp), :(exp2), :(expm1), :(log), :(log10), :(log1p),
          :(log2), :(exponent), :(sqrt))
    @eval $(f)(::Missing) = missing
end

(sekali lagi - Anda dapat melihat bahwa kami tidak peduli dengan nilai variabel - kami tahu tipenya adalah Missing jadi kami mengembalikan missing)

Dalam manual Julia Anda memiliki contoh metode tersebut mis. di sini tetapi diakui sejauh yang saya tahu manual tidak memberikan nama untuk gaya definisi metode ini.

3
Bogumił Kamiński 13 Agustus 2019, 15:27