skaha
1
最近开始学习Julia的基础语法,之前只学过python。前两天看到论坛里有一篇帖子说Julia的struct是不绑定function的,这一点在我看的教程里也有说明。但后来在GitHub上看到有人写的mutable struct中内置的function,我又自己试了一下普通struct中定义一个函数也是不会报错的,但这样一来就不能正常实例化。
代码以及报错若下:
struct Person
name::String
age::Int64
weight::Float64
height::Float64
function BMI(weight::Float64, height::Float64)
return height / weight
end
end
LiXiao = Person("LiXiao", 21, 140.2, 168.5)
ERROR: MethodError: no method matching Person(::String, ::Int64, ::Float64, ::Float64)
Stacktrace:
[1] top-level scope
@ ~/julia_test/machine learning/test.jl:12
想要求教一下这种struct写法是否是正确的呢?如果是正确的该如何成功进行实例化呢?拜托了各位大佬!!!
1 个赞
欢迎加入社区!
你的写法是不对的。
首先阐明几个中英文用语。如果我没弄错的话,你这里指的实例化对应construct,即创建新的struct。其次,你说struct绑定function,这种说法大概来源于面向对象OOP,指的是一个函数作用于指定的类型。
Python是一门面向对象的语言,同时也支持函数编程。Julia不是一门面向对象的语言,而是一门面向过程的语言。做一个比方,如果说面向对象是绑定名词,那么面向过程就是绑定动词。
在Julia中,struct内置函数只能是创建函数constructor。这个创建函数规定必须和struct同名。如果没有写,那么Julia会生成默认的创建函数,参数等同于struct的各个成员。
julia> struct Person
name::String
age::Int64
weight::Float64
height::Float64
end
julia> LiXiao = Person("LiXiao", 21, 140.2, 168.5)
Person("LiXiao", 21, 140.2, 168.5)
julia> struct Person
name::String
age::Int64
weight::Float64
height::Float64
function Person(weight, height)
new("Li Hua", 10, weight, height)
end
end
julia> LiHua = Person(140.2, 168.5)
Person("Li Hua", 10, 140.2, 168.5)
你的例子中,BMI
作为一个函数是不能被定义在struct里面的,原因是,这是一个“动作”,而不是创建函数。最简单的能让这个例子成立的做法是,在定义struct以后,单独列出需要的函数:
julia> function BMI(person::Person)
return person.weight/person.height^2
end
BMI (generic function with 2 methods)
julia> LiXiao = Person("LiXiao", 21, 140.2, 168.5)
Person("LiXiao", 21, 140.2, 168.5)
julia> BMI(LiXiao)
0.004937967226972149
4 个赞