繁体   English   中英

F# nameof operator 不是一流的 function

[英]F# nameof operator not a first-class function

我在我的项目文件中使用带有<LangVersion>preview</LangVersion>的 F# 4.7。

我有这样的类型:

type Record = {
  Name : string
  Description : string
  FieldNotInterestedIn: int
}

我想以类型安全的方式获取某些字段的名称,但不是全部。 我知道我可以使用反射获取所有字段名称。

这是我想出的最简洁的代码。 能不能再简洁点?

let certainFieldNames =
  let r = Unchecked.defaultof<Record>
  
  [
    nameof r.Name
    nameof r.Description
  ]

特殊的 function nameof是一个编译时特性,并返回标识符的 static 名称。 因此,它不能在运行时使用,您的运行时代码不会包含对 function 的任何引用,结果始终是编译时间常数。

因此,您不能将其与管道一起使用,也不能作为第一个 class function 使用。 当你尝试它时,你会得到给定的错误。

您编写的代码是最简洁的,因为您似乎想要获取这些标识符的名称。 没有语法方法可以动态地做到这一点(除了反射,但这是一种完全不同的方法)。

添加此特殊函数/运算符的主要原因是帮助重命名代码中的操作,或者在ArgumentNullException等异常中安全地使用参数名称。

完整的详细信息在 RFC 中,特别是“其他注意事项”部分,其中详细说明了您的用例: https://github.com/fsharp/fslang-design/blob/master/preview/FS-1003-nameof-operator。 MD

在实现中,就不需要使用Unchecked.defaultof进行了长时间的讨论,但是如果不对解析器进行重大重写,我们就找不到这样做的好方法。 请注意,该代码不会增加运行时开销,它会被删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM