新人求助,请问这样一个struct如何进行实例化呢?

最近开始学习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 个赞

原来如此,感谢您的解答