【问题标题】:Julia supports dynamic "expando object" a la C#?Julia 支持 C# 中的动态“扩展对象”?
【发布时间】:2017-09-18 23:39:02
【问题描述】:

在 C# 中,可以使用 expando 对象在运行时定义具有字段的动态对象。示例:

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

如您所见,contact 对象是动态的,从某种意义上说,我们可以在对象中设置字段,而无需事先声明对象的结构。我知道在 Julia 中我们可以有一个没有声明类型的参数/变量,如:

function setProp1(obj) obj.prop1=1 end

但是,据我了解,obj 对象必须从具有字段 prop1 的类型创建。如果 prop1 未在某处声明为字段,则 setProp1 无法动态设置字段 prop1。如果我想要充分的活力,并且我不想担心性能,有没有办法在 Julia 中创建“扩展对象”?

【问题讨论】:

  • This page 建议使用dict“Julia 的类型不支持在运行时动态添加字段。”
  • 我希望有一天会创建一个更方便的语法。 la expando 对象的语法可以帮助来自 python 或其他全动态语言的人。
  • @RobertHarvey 您将旧文档(0.4)稳定的一个(现在为 0.6)链接到 -> docs.julialang.org/en/stable/manual/noteworthy-differences(例如,在 0.4 中记录了与 Python 的 12 处差异,而在 0.6 中只有 10 处)请编辑您的评论,我会删除我的:)

标签: julia dynamic-typing


【解决方案1】:

不,目前无法简单地通过分配给未定义的字段名称来动态创建新字段。将来可能会使用#1974: allow overloading of a.b field access syntax 之类的功能。但请注意,它目前已标记在 Julia 2.0+ 里程碑中;这不是一个高优先级,可能会发生也可能不会发生。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多