gpt4 book ai didi

constructor - Julia 中的变量在构造时会改变它们的类型

转载 作者:行者123 更新时间:2023-12-04 14:43:35 25 4
gpt4 key购买 nike

我是 Julia 编程的新手,正面临着令人费解的情况,我根本无法理解。所以,这就是我想要做的:我有两个结构:ShoePerson,其中 Person 包含一个 Shoe

这就是代码的样子:

struct Shoe
size :: Int64
brand :: String
end

struct Person
age :: Int64
shoe :: Shoe

function Person(a::Int64, s::Shoe)
age = a
shoe = s
end

function Person()
age = 33
shoe = Shoe(17,"Nike")
end
end

ian = Person(17, Shoe(32,"Puma"))
tom = Person()

println(typeof(ian))
println(typeof(tom))

令我大吃一惊的是,我试图将其定义为人的 iantom 竟然是鞋子。知道我做错了什么吗?

最佳答案

function Person,作为 Person 结构的构造函数,应该返回 struct Person 的实例,但是因为它的最后一行是 shoe = Shoe(17,"Nike") (并且因为赋值是一个表达式,可以计算出 shoe 变成的任何值),它最终会返回那个 Shoe.

构造函数应该调用内置的 new 构造函数:

struct Person
age :: Int64
shoe :: Shoe

# This function is redundant since
# it does exactly the same thing as the `new` constructor
function Person(a::Int64, s::Shoe)
age = a
shoe = s

new(age, shoe)
end

function Person()
age = 33
shoe = Shoe(17,"Nike")

new(age, shoe)
end
end

AFAIK,除非它们正在执行输入验证,否则您不需要使用构造函数。你确实需要一个构造函数来确保不可能构造一个带有负agePerson,例如,因为Int64 可以是负数。 (您也可以使用 UInt64 来确保 age >= 0。但是您必须以十六进制编写 17(0x11)一直是,这有点烦人)

我会这样写:

struct Person
age :: Int64
shoe :: Shoe

function Person(age::Int64, shoe::Shoe)
@assert age >= 0

new(age, shoe)
end
end

# Put other constructors outside
Person() = Person(33, Shoe(17, "Nike"))

例子:

julia> Person(-1, Shoe(0, "Hello"))
ERROR: AssertionError: age >= 0
Stacktrace:
[1] Person(age::Int64, shoe::Shoe)
@ Main ./REPL[3]:6
[2] top-level scope
@ REPL[5]:1

julia> Person()
Person(33, Shoe(17, "Nike"))

关于constructor - Julia 中的变量在构造时会改变它们的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69315952/

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