F# nameof 运算符不是一等函数

2024-05-12

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

我有这样的类型:

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

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

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

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

特殊功能nameof是一个编译时功能,并返回标识符的静态名称。因此,它不能在运行时使用,运行时代码将不包含对该函数的任何引用,结果始终是编译时常量。

因此,您不能将它与管道一起使用,也不能作为第一类函数。当您尝试时,您将收到给定的错误。

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

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

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

在实现过程中,针对不需要使用Unchecked.defaultof,但是如果不对解析器进行重大重写,我们找不到一种好的方法来做到这一点。请注意,该代码不会增加运行时开销,而是会被删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# nameof 运算符不是一等函数 的相关文章

  • 如何在 Java 9 中使用新的 BeanInfo 注解

    JEP 256 BeanInfo 注释 http openjdk java net jeps 256为JavaBean http download java net java jdk9 docs api java beans JavaBea
  • F# 正确使用序列缓存

    我正在尝试将 Seq cache 与我制作的函数一起使用 该函数返回最多为 N 的素数序列 不包括数字 1 我无法弄清楚如何将缓存的序列保留在范围内 但仍然使用它在我的定义中 let rec primesNot1 n 2 n gt Seq
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 使用反射获取通用 IDictionary 的值

    我有一个实现的实例IDictionary
  • 在 C# 中使用反射列出枚举中的值

    我正在尝试使用反射来列出一个 Visual Studio 解决方案内的各个项目中的一些类的公共成员和方法 我尝试访问的所有类都是 C 的 并且它们都是从 C 类访问的 我用来进行这些调用的代码如下 public void PopulateE
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 在 F# 类型提供程序中发出生成的类型

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https
  • “不等于”的 F# 语法是什么?

    在 C 代码中 它会是这样的 if c 0 some code 那么在 F 中呢 From MSDN 有关 F 算术运算符的页面 http msdn microsoft com en us library dd469493 aspx 看起来
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • Type.GetInterface 和嵌套类型

    我刚刚发现 Type GetInterface 和嵌套类型有一个非常奇怪的行为 以下示例代码将显示问题 我使用接口的 Type FullName 来检查给定类型是否派生自该接口 public interface IStandardInter
  • 如何更改运行时中的方法注释值?

    我有像这样的控制器 MessageMapping room register SendTo sendTo public Message addUser Payload Message message SimpMessageHeaderAcc
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 将事件绑定到 ItemsControl 中的按钮

    我有一个 Windows Phone 7 应用程序 其中包含一些 xaml 如下所示
  • 如何在 Perl 中循环访问类的所有方法?

    如何在 Perl 中循环访问一个类的所有方法 有没有关于 Perl 内省或反射的好的在线参考 Todd Gardner 使用 Moose 的建议很好 但他选择的示例代码并不是很有帮助 如果你正在检查一个非 Moose 使用类 你会这样做 u
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • 使用 Scala 宏或反射实例化类

    在我的 scala 代码中 我希望能够实例化一个新类 例如 假设我有以下代码 class Foo def foo 10 trait Bar val bar 20 理想情况下 我希望能够做类似的事情 def newInstance A lt
  • 如何判断 Type 是列表、数组还是 IEnumerable 或

    给定一个最简单的方法是什么Type对象 测试它是否实际上是一个对象列表 IE 数组或 IEnumerable IEnumerable Check typeof IEnumerable IsAssignableFrom type 每个集合类型

随机推荐