如何在 struct 中定义 private field?


#1

比如我有这样一个 struct

struct A
    X
    T
end

我想要让 X 被隐藏以来,供开发者使用,用户只要调用 T(和 X 取值一样)就可以了。


julia对象有没有类似Java,c++那样的私有属性不允许外部修改的
#2

暂不支持,未来是否支持要看这个issue的讨论结果:


#3

没有类的专有方法,如何才能支持私有变量。
对于一个struct,无论是开发者还是用户,在调用的他的时候是对等的,难不成私有变量后面加个只有开发者知道暗号?
要不然像python一样弄个约定俗成加’__’.


#4

Julia对象有没有类似Java c++那样的私有属性不允许外部修改的。比如定义一个类型,有些属性不给外部修改。


#5

试试这个?


  1. 更新到 1.0 : typemutable struct

    Java-likeClass.jl

mutable struct JavaClass

    # Public fields
    name::String

    # Public methods
    getName::Function
    setName::Function
    getX::Function
    getY::Function
    setX::Function
    setY::Function

    # Primary Constructor - "through Whom all things were made."
    function JavaClass(namearg::String, xarg::Int64, yarg::Int64)

        # Private fields - implemented as "closed" variables
        x = xarg
        y = yarg

        # Private methods used for "overloading"
        setY(yarg::Int64) = (y = yarg; return nothing)
        setY(yarg::Float64) = (y = Int64(yarg * 1000); return nothing)

        # Construct object
        this = new()
        this.name = namearg
        this.getName = () -> this.name
        this.setName = (name::String) -> (this.name = name; return nothing)
        this.getX = () -> x
        this.getY = () -> y
        this.setX = (xarg::Int64) -> (x = xarg; return nothing)
        this.setY = (yarg) -> setY(yarg) #Select appropriate overloaded method

        # Return constructed object
        return this
    end

    # a secondary (inner) constructor
    JavaClass(namearg::String) = JavaClass(namearg, 0,0)
end

用法同 sf

  1. 这一种看上去能有类似的效果,不过就不是定义类型了
julia> function Person(name, age)
        getName() = name
        getAge() = age
        getOlder() = (age+=1)
        ()->(age;getName;getAge;getOlder)
       end
Person (generic function with 1 method)

julia> o = Person("bob", 26)
#36 (generic function with 1 method)

julia> o.age
Core.Box(26)

julia> o.name
ERROR: type ##36#40 has no field name
Stacktrace:
 [1] getproperty(::Any, ::Symbol) at .\sysimg.jl:18

julia> o.getName()
"bob"

julia> o.getAge()
26

julia> o.getOlder()
27

julia> o.getAge()
27

julia> typeof(o)
getfield(Main, Symbol("##36#40")){getfield(Main, Symbol("#getName#37")){String},getfield(Main, Symbol("#getAge#38")),getfield(Main, Symbol("#getOlder#39"))}

#6

将部分成员封装在一个immutable里面,外部就无法修改了。但是依然可以访问。例如

mutable struct 你的Class
    _某个private::Private成员
    别的可以修改的成员
end

struct Private成员
    a
    b
    c
end

我只是举个例子,别用这种风格写代码哈。