2017-09-18 75 views
1

在C#中可能有一个动态对象,其中包含使用expando对象在运行时定义的字段。例如:Julia支持动态的“expando对象”a la C#?

dynamic contact = new ExpandoObject(); 
contact.Name = “Patrick Hines”; 
contact.Phone = “206-555-0144”; 

正如你所看到的,接触对象是动态的,在这个意义上,我们可以设置的对象字段,而无需事先声明对象的结构。我在茱莉亚明白,我们可以有一个参数/变量不声明的类型,如:

function setProp1(obj) obj.prop1=1 end 

但是,据我了解,在OBJ对象必须从一个字段为prop1一个类型创建。如果prop1未作为字段声明,则setProp1不能动态设置字段prop1。如果我想要充分的活力,并且我不想担心表现,有没有办法在Julia中创建“expando物体”?

+2

[本页](https://docs.julialang.org/zh/release-0.4/manual/noteworthy-differences/)建议使用['dict'](https://docs.julialang.org/ EN /释放-0.4/STDLIB /收藏/#Base.Dict)。 *“Julia的类型不支持在运行时动态添加字段。”* –

+0

我希望有一天会创建更方便的语法。 la expando对象的语法可以帮助来自python或其他完整动态语言的人员。 – gabomgp

+0

@RobertHarvey你链接的旧文档(0.4)稳定的一个(现在0.6)是 - > https://docs.julialang.org/en/stable/manual/noteworthy-differences/(例如有12个记录与Python 0.4,只有10在0.6)请编辑您的评论,我会删除我的:) – Liso

回答

2

不,目前不可能仅通过分配未定义的字段名称来动态创建新字段。将来可能会使用像#1974: allow overloading of a.b field access syntax这样的功能。但是,请注意,它目前在Julia 2.0+里程碑中被标记;这不是一个高度优先事项,可能会或可能不会发生。

可以创建一个将字段访问更改为字典式语法的宏,例如@expando contact.Name = "foo"被转换为contact[:Name] = "foo",但直接使用字典和索引语法可能更好也更容易。