這一節我們要講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...