【问题标题】:Nemerle Extension PropertyNemerle 扩展属性
【发布时间】:2011-12-12 15:05:30
【问题描述】:

最近有一个关于在 Nemerle 语言中添加扩展属性的讨论。 但是语法不清楚。

更新的建议语法:

module MExtension
{
  [ExtensionProperty(string)] public StringProp : int    { get; set; } 
  [ExtensionProperty(int)]    public IntProp    : string { get { "abc" } }
}

module MTest
{
  F() : void
  {
    def x : int = "ab".StringProp;
    "abc".StringProp = 100;

    def y : string = 10.IntProp;
  }
}

注意:模块 == 静态类

你怎么看?

【问题讨论】:

    标签: nemerle


    【解决方案1】:

    由于重复,我不喜欢它:

    1. 您应该分两点指定Type2,
    2. 您应该分两点指定 PropName。

    所以重构可能会稍微复杂一些。下面的方法怎么样?

    module MExtension
    {
      property PropName(this arg : Type1) : Type2
      {
        get
        {
          ...
        }
        set
        {
          ... = value
        }
      }
    }
    

    甚至是自动属性:

    module MExtension
    {
      property PropName(this arg : Type1) : Type2 { get; set; }
    }
    

    【讨论】:

    • 要使用你的语法,必须有一个特殊的关键字“property”来消除它与方法的歧义。公共属性 ExtensionProperty(this arg : Type1) : Type2 { } public ExtensionMethod(this arg : Type1) : Type2 { ... } 这不好,因为它破坏了旧代码。然后最好添加[ExtensionProperty]之类的属性。或者也许使用其他括号。不是 () ,而是 {} 例如。
    • 实际上,我的想法通常基于宏以及任何底层实现。 "property" 可以是一个宏,它可以将声明转换为任何适当的形式。
    • 我明白了,但仅使用宏是不可能的。因为你必须有语法扩展 SomeObject.SomeProperty。这必须在编译器内核中完成,并且。宏有助于减少代码,例如,如果您采用显式 get_ 、 set_ 方法的可能语法。您的解决方案已经足够好,但必须使用其他大括号来明确区分扩展方法。我认为最好使用 {},因为 () 用于方法,而 [] 用于索引器。公共 MyProp : int {this m : Type1} { get;放; }
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多