当前位置: 首页 > 知识库问答 >
问题:

为什么“Julia Language Documentation”中的这一行为输入参数是不同类型的情况定义了一个外部构造函数?

狄晟睿
2023-03-14

为了构建性能良好的队列应用程序,我正在重读Julia语言文档,关于参数构造函数和外部构造函数的部分让我感到困惑。它们展示的例子如下:

julia> struct OurRational{T<:Integer} <: Real
           num::T
           den::T
           function OurRational{T}(num::T, den::T) where T<:Integer
               if num == 0 && den == 0
                    error("invalid rational: 0//0")
               end
               g = gcd(den, num)
               num = div(num, g)
               den = div(den, g)
               new(num, den)
           end
       end

julia> OurRational(n::T, d::T) where {T<:Integer} = OurRational{T}(n,d)
OurRational

julia> OurRational(n::Integer, d::Integer) = OurRational(promote(n,d)...)
OurRational

julia> OurRational(n::Integer) = OurRational(n,one(n))
OurRational

文件指出:

第一个是“标准”的一般(外部)构造函数,当分子和分母具有相同的类型时,它从它们的类型推断类型参数T。

由此我开始理解这个构造函数处理两个参数的情况。它从(num和den)的类型中推断出T,然后将其提供给OurRational内部构造函数。

文件接着说:

第二种方法适用于给定的分子和分母值具有不同类型时:它将它们提升为公共类型,然后将构造委托给外部构造函数以获取匹配类型的参数。

看着代码,我不明白这是怎么回事。根据我认为Julia是如何计算的,第二个构造函数难道不会处理n和d都是显式整数的情况吗?如果不是这样的话,我真的很难看到朱莉娅是如何看待这条线的。另外,赋值后缀中的省略号意味着“现在,当两个参数具有相同类型时,转到外部构造函数”,对吗?

我很好地理解第三个外部构造函数。

共有1个答案

董宜然
2023-03-14

第一个和第二个外部构造函数不同,因为第二个构造函数处理的情况是分子和命名都是整数,但却是两个不同的具体子类型,都是抽象类型Integer。

正如您所知,Julia有许多builtin整数类型。例如,考虑UInt8,它是单字节语法的默认类型,如0x1F。看看将UInt8和默认整数类型INT64混合后的结果:

julia> struct OurRational{T<:Integer} <: Real
           num::T
           den::T
           function OurRational{T}(num::T, den::T) where T<:Integer
               println("Inner")
               if num == 0 && den == 0
                   error("invalid rational: 0//0")
               end
               g = gcd(den, num)
               num = div(num, g)
               den = div(den, g)
               new(num, den)
           end
       end

julia>

julia> OurRational(n::T, d::T) where {T<:Integer} = begin println("Outer 1"); OurRational{T}(n,d) end
OurRational

julia> OurRational(n::Integer, d::Integer) = begin println("Outer 2"); OurRational(promote(n,d)...) end
OurRational

julia> OurRational(n::Integer) = begin println("Outer 3"); OurRational(n,one(n)) end
OurRational

julia> OurRational{UInt8}(0x2, 0x5)
Inner
OurRational{UInt8}(0x02, 0x05)

julia> OurRational(2, 5)
Outer 1
Inner
OurRational{Int64}(2, 5)

julia> OurRational(0x2, 5)
Outer 2
Outer 1
Inner
OurRational{Int64}(2, 5)

julia> OurRational(0x3)
Outer 3
Outer 1
Inner
OurRational{UInt8}(0x03, 0x01)

因此,第二个外部构造函数将参数提升为相同的类型,然后将它们传递给第一个外部构造函数,然后将其传递给内部构造函数。

 类似资料:
  • (这个问题是这个问题的后续问题。) 上述程序使用 而选择一个产生警告来诊断不正确的狭窄 并产生结果 我的问题是如果 其次,对于是一个可行的函数,每个参数都应该存在一个隐式转换序列,该序列将该参数转换为的相应参数。 从 表达式可以隐式转换为类型,当且仅当声明;对于一些发明的临时变量,格式良好。 从 如果初始化子句是表达式,并且需要缩小转换来转换表达式,则程序格式错误。 使用和,因为以下内容格式不正确

  • jaxb绑定 我定义了绑定,将的名称重写为。在XJC生成中,它生成PersonType.class和Ptype.class。 如果我在元素内部定义,那么它不会生成ptype.class。但是我必须在模式的根级别声明,因为这个也被其他模式引用。 我试图在绑定中重写和,但生成了ptype.class。 我如何指示它不要生成ptype.class?

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,

  • 考虑以下类来演示Java中的内部类行为。主代码在方法中。其余的只是管道代码。 我只是打印下面的javap输出隐藏的构造函数: 通常情况下,编译器确保子类构造函数在初始化自己的字段之前首先调用超类构造函数。这有助于正确构造对象,但我发现编译器为内部类生成的构造函数与规范行为不符。为什么会这样?是否由JLS指定? 附言:我知道内部类包含对外部类的隐藏引用,该引用在上面的javap输出中设置。但问题是为

  • 允许您执行以下操作: 但不是这个: 可能是因为返回类型不是函数签名的一部分。但是是一个类类型,它被赋予一个返回类型,并且知道构造它的函数对象的返回类型。所以这里可能有编译器错误。 为什么没有编译器错误?

  • 我遇到了这段代码,不知道为什么X在这里工作。