当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 方法

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:12

:Bidiagonal{T}) at linalg/special.jl:108 +{T<:Number}(x::AbstractArray{T<:Number,N}) at abstractarray.jl:358 +(A::AbstractArray{T,N},x::Number) at array.jl:770 +(x::Number,A::AbstractArray{T,N}) at array.jl:771 +(J1::UniformScaling{T<:Number},J2::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:25 +(J::UniformScaling{T<:Number},B::BitArray{2}) at linalg/uniformscaling.jl:27 +(J::UniformScaling{T<:Number},A::AbstractArray{T,2}) at linalg/uniformscaling.jl:28 +(J::UniformScaling{T<:Number},x::Number) at linalg/uniformscaling.jl:29 +(x::Number,J::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:30 +{TA,TJ}(A::AbstractArray{TA,2},J::UniformScaling{TJ}) at linalg/uniformscaling.jl:33 +{T}(a::HierarchicalValue{T},b::HierarchicalValue{T}) at pkg/resolve/versionweight.jl:19 +(a::VWPreBuildItem,b::VWPreBuildItem) at pkg/resolve/versionweight.jl:82 +(a::VWPreBuild,b::VWPreBuild) at pkg/resolve/versionweight.jl:120 +(a::VersionWeight,b::VersionWeight) at pkg/resolve/versionweight.jl:164 +(a::FieldValue,b::FieldValue) at pkg/resolve/fieldvalue.jl:41 +(a::Vec2,b::Vec2) at graphics.jl:60 +(bb1::BoundingBox,bb2::BoundingBox) at graphics.jl:123 +(a,b,c) at operators.jl:82 +(a,b,c,xs...) at operators.jl:83重载和灵活的参数化类型系统一起,使得 Julia 可以抽象表达高级算法,不需关注实现的具体细节,生成有效率、运行时专用的代码。方法歧义函数方法的适用范围可能会重叠: julia> g(x::Float64, y) = 2x + y; julia> g(x, y::Float64) = x + 2y; Warning: New definition g(Any,Float64) at none:1 is ambiguous with: g(Float64,Any) at none:1. To fix, define g(Float64,Float64) before the new definition. julia> g(2.0, 3) 7.0 julia> g(2, 3.0) 8.0 julia> g(2.0, 3.0) 7.0此处 g(2.0, 3.0) 既可以调用 g(Float64, Any),也可以调用 g(Any, Float64),两种方法没有优先级。遇到这种情况,Julia 会警告定义含糊,但仍会任选一个方法来继续执行。应避免含糊的方法: julia> g(x::Float64, y::Float64) = 2x + 2y; julia> g(x::Float64, y) = 2x + y; julia> g(x, y::Float64) = x + 2y; julia> g(2.0, 3) 7.0 julia> g(2, 3.0) 8.0 julia> g(2.0, 3.0) 10.0要消除 Julia 的警告,应先定义清晰的方法。参数化方法构造参数化方法,应在方法名与参数多元组之间,添加类型参数: julia> same_type{T}(x::T, y::T) = true; julia> same_type(x,y) = false;这两个方法定义了一个布尔函数,它检查两个参数是否为同一类型: julia> same_type(1, 2) true julia> same_type(1, 2.0) false julia> same_type(1.0, 2.0) true julia> same_type("foo", 2.0) false julia> same_type("foo", "bar") true julia> same_type(int32(1), int64(2)) false类型参数可用于函数定义或函数体的任何地方: julia> myappend{T}(v::Vector{T}, x::T) = [v..., x] myappend (generic function with 1 method) julia> myappend([1,2,3],4) 4-element Array{Int64,1}: 1 2 3 4 julia> myappend([1,2,3],2.5) ERROR: `myappend` has no method matching myappend(::Array{Int64,1}, ::Float64) julia> myappend([1.0,2.0,3.0],4.0) 4-element Array{Float64,1}: 1.0 2.0 3.0 4.0 julia> myappend([1.0,2.0,3.0],4) ERROR: `myappend` has no method matching myappend(::Array{Float64,1}, ::Int64)下例中,方法类型参数 T 被用作返回值: julia> mytypeof{T}(x::T) = T mytypeof (generic function with 1 method) julia> mytypeof(1) Int64 julia> mytypeof(1.0) Float64方法的类型参数也可以被限制范围: same_type_numeric{T<:Number}(x::T, y::T) = true same_type_numeric(x::Number, y::Number) = false julia> same_type_numeric(1, 2) true julia> same_type_numeric(1, 2.0) false julia> same_type_numeric(1.0, 2.0) true julia> same_type_numeric("foo", 2.0) no method same_type_numeric(ASCIIString,Float64) julia> same_type_numeric("foo", "bar") no method same_type_numeric(ASCIIString,ASCIIString) julia> same_type_numeric(int32(1), int64(2)) falsesame_type_numeric 函数与 same_type 大致相同,但只应用于数对儿。关于可选参数和关键字参数函数中曾简略提到,可选参数是可由多方法定义语法的实现。例如: f(a=1,b=2) = a+2b可以翻译为下面三个方法: f(a,b) = a+2b f(a) = f(a,2) f() = f(1,2)关键字参数则与普通的与位置有关的参数不同。它们不用于方法重载。方法重载仅基于位置参数,选取了匹配的方法后,才处理关键字参数。

上一页  [1] [2] [3] 


Julia 方法