Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ https://github.com/JuliaLang/julia/pull/13123 , ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ @supercall
ΠΌΠ°ΠΊΡΠΎΡ , ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ»Π°ΠΆΠ΄Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ invoke
ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ. ΠΠΎΡ ΡΠ΅ΠΊΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ:
macro callsuper(ex)
ex.head == :call || error("<strong i="9">@invoke</strong> requires a call expression")
args = ex.args[2:end]
types = Symbol[]
vals = Symbol[]
blk = quote end
for arg in args
val = gensym()
typ = gensym()
push!(vals, val)
push!(types, typ)
if isa(arg,Expr) && arg.head == :(::) && length(arg.args) == 2
push!(blk.args, :($typ = $(esc(arg.args[2]))))
push!(blk.args, :($val = $(esc(arg.args[1]))::$typ))
else
push!(blk.args, :($val = $(esc(arg))))
push!(blk.args, :($typ = typeof($val)))
end
end
push!(blk.args, :(invoke($(esc(ex.args[1])), ($(types...),), $(vals...))))
return blk
end
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²Π·ΡΡΠ° ΠΈΠ· https://github.com/JuliaLang/julia/pull/11165.
Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ ΡΠΈΠΏΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² invoke, Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΡΠΏΠ΅ΡΡΠΈΠΏΠ°ΠΌΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ?
ΠΠ»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, <strong i="5">@invoke</strong> foo(x, y::T)
ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡΡΡ Π² invoke(foo, (typeof(x), T), x,y)
, ΡΠΎ Π΅ΡΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ typeasserts Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ΡΠΈΠ³Π½Π°ΡΡΡΡ Π²ΡΠ·ΠΎΠ²Π°.
ΠΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ post-1.0. ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ Triage ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΡΠ΄ Π»ΠΈ ΠΌΡ ΡΠ΄Π°Π»ΠΈΠΌ invoke
Π΄Π»Ρ 1.0.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠ»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ,
<strong i="5">@invoke</strong> foo(x, y::T)
ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡΡΡ Π²invoke(foo, (typeof(x), T), x,y)
, ΡΠΎ Π΅ΡΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ typeasserts Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ΡΠΈΠ³Π½Π°ΡΡΡΡ Π²ΡΠ·ΠΎΠ²Π°.