Building function (like OOP) inside a struct

This is my demo, my goal is run set_grade! successfully. How can achieve this?


# try demo
mutable struct Group

    members::Dict{String, Int64}         # project => grade
    const list::Vector{String}           # project name list
    const set_grade!::Function
    # 
    function set_grade!(group::Group, project::String, grade::Int64)
        if project in group.list
            if !(haskey(group.list, project))
                push!(group.members, project => grade)
            end
        else
            error("wrong project name: ", project)
        end
    end
    function Base.getproperty(group::Group, prop::Symbol)
        if prop == :set_grade!
            return (project, grade,)->set_grade!(group, project, grade)
        else
            throw(UndefVarError(prop))
        end
    end

    # 
    function Group()
        group = new(
            Dict{String,Any}(),                                     # members
            ["project1", "project2", "project3"],                   # list
            (project, grade,)->set_grade!(group, project, grade)    # function
        )
        return group
    end
end

member1 = Group();
member1.set_grade!("project1", 93)  # wrong
1 Like

Short answer: don’t do this. Julia style is to do method(object, args…) and not object.method(args…), and to define methods outside of struct definitions (with the exception of inner constructors). Trying to force OOP syntax on Julia will lead to non-idiomatic code, re-introduces the expression problem, and will be slow if you’re not clever.

Long answer: see many previous discussions of this topic, e.g.:

6 Likes