gpt4 book ai didi

types - Julia v0.6 构造函数和 'new' 关键字

转载 作者:行者123 更新时间:2023-12-05 00:48:02 25 4
gpt4 key购买 nike

我对 Julia 中的参数复合类型(结构)感到很困惑。我正在使用 v0.6。我想知道是否有人可以向我解释这两段代码之间的区别?第一个似乎有效,但第二个给出了错误( ERROR: LoadError: syntax: too few type parameters specified in "new{...}" )。我特别困惑:

  • 什么是例如Point{G}(x,y) where {G<:Integer} = new(55,y)在第一个 Point 定义内。好像不是方法?见 println(methods(Point))几行之后。它是“构造函数”吗?如果是这样,那么构造函数和方法之间的区别是什么?
  • 关键字new是什么意思真的吗?
  • 为什么第二段代码无效?

  • `
    workspace()
    println("\nSTART")

    struct Point{T<:Real}
    x::T
    y::T
    # These are not 'methods' - see below. What are they!?
    Point{G}(x,y) where {G<:Integer} = new(55,y)
    Point{H}(x,y) where {H<:AbstractFloat} = new(x, 11)
    end
    println(methods(Point)) # Interesting!!!

    # Are these methods? Are they 'constructors'?
    Point(x::T, y::T) where {T<:Integer} = Point{T}(x,y)
    Point(x::T, y::T) where {T<:AbstractFloat} = Point{T}(x,y)
    println(methods(Point))

    p = Point(2,3)
    p2 = Point(2.0,3.0)

    ##########################################################################

    # Errors!
    workspace()
    println("")

    struct Point{T<:Real}
    x::T
    y::T
    Point(x::T, y::T) where {T<:Integer} = new(55, y)
    Point(x::T, y::T) where {T<:AbstractFloat} = new(x, 11)
    end
    println(methods(Point))

    p = Point(2,3)
    p2 = Point(2.0,3.0)

    `

    最佳答案

    我认为你应该阅读 this part of the Julia documentation .

    对您的问题的简短回答:

    1) 一个方法可以做任何事情。构造函数创建一个对象。 (如果你愿意,这是一种特殊的方法)

    2) 它用于在类型定义中创建对象。

    3) 使用 new{T}(55,y)而不是 new(55,y) .

    首例

    您的 Point{G}(x,y) where {G<:Integer} = new(55,y)第一种情况是 内部构造函数 .内部,因为它位于类型定义的内部。构造函数始终存在,即即使您注释掉这些行,您仍然可以执行 Point{Int64}(3,2) .因此,您实际上正在做的是通过明确告诉 Julia 在特定情况下做什么来覆盖默认构造函数 G<:Integer ,即始终设置 x55 . new(55,y)然后实际上创建了一个 Point{G}对象 x=55y=y . (注意,如果你写 Point{G}(x,y) where {G<:Integer} = Point{G}(55,y) ,我们会有一个循环,所以像 new() 这样的东西确实是必要的。)从技术上讲,你应该使用 new{G}(55,y)创建 Point{G}对象,但 Julia 足够聪明,可以自动获取 G从 lhs 上的构造函数。这将是情况 2 中的一个问题。

    的输出

    julia> println(methods(Point)) # Interesting!!!
    # 1 method for generic function "(::Type)":
    (::Type{T})(arg) where T in Base at sysimg.jl:77

    告诉你有一些构造函数可以通过将类型名称(包括类型参数)作为函数名称来调用,例如 Point{Float64}(1.2, 3.4) .我不知道为什么 Julia 没有明确列出不同的构造函数。
    # Are these methods? Are they 'constructors'?
    Point(x::T, y::T) where {T<:Integer} = Point{T}(x,y)
    Point(x::T, y::T) where {T<:AbstractFloat} = Point{T}(x,y)
    println(methods(Point))

    这些是方法。一个迹象是你可以用不同的方式命名它们: create_a_point(x::T, y::T) where {T<:Integer} = Point{T}(x,y) .对于(内部)构造函数,您不能这样做。然而,有时它们被称为“构造方法”。

    第二种情况

    您必须明确指定类型参数: new{T}(55,y) .与情况 1 不同,在 lhs 上没有给出 Julia 可以自动使用的类型参数。

    也许对 Julia 有更多技术知识的人可以给出更准确的答案。但在那之前,我希望这会有所帮助。

    关于types - Julia v0.6 构造函数和 'new' 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50433018/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com