六 Julia多重派發

2021-10-10 17:46:35 字數 3768 閱讀 2492

這一節我們要講julia的乙個重要特性——多重派發(multiple dispatch)。

為了更好理解julia中的多重派發,可以來看看julia+運算子。通過對+呼叫methods()函式,可以看出juila中已經有多少關於+運算子的定義。

methods(+)
184 methods for generic function+:

​ ...

+(a, b, c, xs...) in base at operators.jl:538

可以使用which巨集檢視我們在使用+運算子時到底使用了哪個方法。

@which 3 + 3

@which 3 + 3.0
+(x::number, y::number) in base at promotion.jl:311

@which 3.0 + 3.0
+(x::float64, y::float64) in base at float.jl:401

此外,我們也可以為+擴充套件新的方法。

首先需要從base庫匯入+

import base: +
比如我們想用+串聯字串。+原本是沒有這個功能的。

"hello " + "world!"
methoderror: no method matching +(::string, ::string)

closest candidates are:

+(::any, ::any, !matched::any, !matched::any…) at operators.jl:538

stacktrace:

[1] top-level scope at in[10]:1

[2] include_string(::function, ::module, ::string, ::string) at ./loading.jl:1091

[3] execute_code(::string, ::string) at /home/lupeng/.julia/packages/ijulia/a1snk/src/execute_request.jl:27

[4] execute_request(::zmq.socket, ::ijulia.msg) at /home/lupeng/.julia/packages/ijulia/a1snk/src/execute_request.jl:86

[5] #invokelatest#1 at ./essentials.jl:710 [inlined]

[6] invokelatest at ./essentials.jl:709 [inlined]

[7] eventloop(::zmq.socket) at /home/lupeng/.julia/packages/ijulia/a1snk/src/eventloop.jl:8

[8] (::ijulia.var"#15#18")() at ./task.jl:356

@which "hello " + "world!"
no unique matching method found for the specified argument types

stacktrace:

[1] error(::string) at ./error.jl:33

[2] which(::any, ::any) at ./reflection.jl:1158

[3] top-level scope at in[11]:1

[4] include_string(::function, ::module, ::string, ::string) at ./loading.jl:1091

[5] execute_code(::string, ::string) at /home/lupeng/.julia/packages/ijulia/a1snk/src/execute_request.jl:27

[6] execute_request(::zmq.socket, ::ijulia.msg) at /home/lupeng/.julia/packages/ijulia/a1snk/src/execute_request.jl:86

[7] #invokelatest#1 at ./essentials.jl:710 [inlined]

[8] invokelatest at ./essentials.jl:709 [inlined]

[9] eventloop(::zmq.socket) at /home/lupeng/.julia/packages/ijulia/a1snk/src/eventloop.jl:8

[10] (::ijulia.var"#15#18")() at ./task.jl:356

現在我們來為+新增串聯字串的功能。

+(x::string, y::string) = string(x, y)
"hello " + "world!"
「hello world!」

@which "hello " + "world!"
+(x::string, y::string) in main at in[13]:1

再看乙個例子

foo(x, y) = println("duck-typed foo!")

foo(x::int, y::float64) = println("foo with an integer and a float!")

foo(x::float64, y::float64) = println("foo with two floats!")

foo(x::int, y::int) = println("foo with two integers!")

foo (generic function with 4 methods)

foo(1, 1)
foo with two integers!

foo(1., 1.)
foo with two floats!

foo(1, 1.0)
foo with an integer and a float!

foo(true, false)
duck-typed foo!

Julia 之初體驗(六)有理數

有理數 julia有乙個有理數型別,用來表示整數之比。使用 運算子構造有理數 julia 2 3 2 3julia 6 9 2 3 julia 4 8 1 2 julia 5 15 1 3 julia 4 12 1 3julia自動化簡,自動約分。分母變成不是負數形式。julia有兩函式可以用來取分...

六 多對多查詢

實體類 public class role implements serializable public class user implements serializable 測查詢所有角色,同時獲取每個角色的使用者資訊 namespace com.liaoxiang.dao.iroledao ro...

julia常用矩陣函式 Julia中的函式

如何宣告函式 julia為我們提供了一些編寫函式的方法。第乙個需要function和end關鍵字 function sayhi name println hi name,it s great to see you endfunction f x x 2end 我們可以像這樣呼叫已宣告的函式 sayh...