defrecord 构造函数中未强制执行类型提示

2023-11-21

我使用创建了一个类型defrecord带有字段的类型提示。然而,我发现这些类型提示在构造函数中没有强制执行,我可以用它们做一些奇怪的事情。例如,请看下面的代码片段:

user=> (defrecord Person [#^String name #^Integer age])
user.Person
user=> (seq (.getConstructors Person))
(#<Constructor public user.Person(java.lang.Object,java.lang.Object,
java.lang.Object,java.lang.Object)>
#<Constructor public user.Person(java.lang.Object,java.lang.Object)>)
user=> (Person. (Integer. 123) "abhinav")
#:user.Person{:name 123, :age "abhinav"}

显示的构造函数签名与提供的类型提示不匹配(它们使用Object对彼此而言String and Integer)并且我能够构造具有错误字段类型的对象。

我的代码有问题还是 Clojure 中的错误?

我使用的是 Clojure 1.2.0-beta1。


类型提示用于避免反射;它们(当前)不用于静态类型函数或构造函数参数(基元除外,因为它们不能包含在Object)。因此,它们对于简单的记录并没有做太多的事情,但在添加协议实现时它们确实很重要,例如:



user=> (set! *warn-on-reflection* true)
true
user=> (defprotocol P (foo [p]))
P
user=> (defrecord R [s] P (foo [_] (.getBytes s)))  ; getBytes is a method on String
Reflection warning, NO_SOURCE_PATH:6 - reference to field getBytes can't be resolved.
user.R
user=> (foo (R. 5))
java.lang.IllegalArgumentException: No matching field found: getBytes for class java.lang.Integer (NO_SOURCE_FILE:0)
user=> (defrecord R [^String s] P (foo [_] (.getBytes s)))
user.R
user=> (foo (R. 5))
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String (NO_SOURCE_FILE:0)
  

两个版本的区别在于后者发出字节码调用String.getBytecode()(因此当传递一个 Integer 时会出现 ClassCastException),而前者需要查找到底是什么.getBytes意味着关于传递给函数的运行时对象(并且当传递整数时该过程失败)。

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

defrecord 构造函数中未强制执行类型提示 的相关文章

  • Emacs/Swank/Paredit for Clojure 的温和教程

    我要转向 Emacs 来工作Clojure http en wikipedia org wiki Clojure Lisp 为了能够执行以下操作 我需要在 Emacs 上设置哪些信息 自动匹配 生成相应的右括号 自动缩进 Lisp Cloj
  • 获取调用表单的名称空间

    我想要一个宏this ns这样它就会返回调用它的位置的名称空间 例如 如果我有这段代码 ns nstest main require nstest core as nstest defn ns str x gt x getName name
  • clojure 要求语法原理

    我很难理解 因此记住 此处描述的 clojure require 语法 http clojuredocs org clojure core 1 3 0 clojure core require http clojuredocs org cl
  • Clojure 宏expand

    Why does macroexpand arm getHand getFinger 扩展到 arm getHand getFinger while macroexpand gt arm getHand getFinger 扩展到 getF
  • 具有类型提示的 const 方法的 python 等效项

    我正在尝试找到 c 的 python 等价物const方法 那是 方法是禁止的改变any他们班级的数据成员 from typing import Final age Final 2 age 3 lt warn about this work
  • Clojure:无法找到静态字段

    给出以下代码 map Integer parseInt 1 2 3 4 为什么除非我换行 否则会出现以下异常Integer parseInt在匿名函数中并手动调用它 Integer parseInt clojure lang Compile
  • 如何编写 Clojure 宏来从字符串创建正则表达式?

    我正在创建一个方便的宏 部分便利在于可以仅使用字符串来指定正则表达式 而不是使用 re 表示法 我无法弄清楚的一部分是如何让宏获取字符串并将其重写为 Clojure 正则表达式 例如 生成 re 符号 我认为这是一个语法 转义问题 我的第一
  • 设置、让、宏、坚果

    我正在尝试从 html 内容构建一个快速目录 为了简短起见 代码非常简单 defn toc content doseq i take 5 iterate inc 1 let h str h i println content h where
  • Clojure 符号名称中的美元符号 ($)

    我一直在编写 clojure 解析器并遇到以下语法 defn key Returns the key of the map entry added 1 0 static true java util Map Entry e e getKey
  • 我如何在环中模拟 json post 请求?

    我正在使用橄榄石 https github com xeqi peridot https github com xeqi peridot测试我的环应用程序 它工作正常 直到我尝试使用 json 数据模拟 post 请求 require ch
  • 如何使用 clojurescript repl 评估宏

    一旦浏览器连接到 clojurescript repl 我以前就无法从 repl 调用宏 这个问题过去曾让我放弃使用 clojurescript 而更喜欢直接使用 javascript 基本上 我觉得 cljs repl 有点蹩脚 我又回到
  • 如何在 RHEL 6.1 / JDK7 上安装 Clojure 1.3 with contribs?

    我一直在努力让它发挥作用 获取 clojure 1 3 是一件轻而易举的事 但现在我一直在尝试安装 contrib 库 但遇到了错误 有关于如何正确执行此操作的指南吗 旧的 clojure contrib 整体库与 clojure 1 3
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • Clojure 缩减函数的目的

    clojure 的目的是什么reduced函数 在 Clojure 1 5 中添加 https clojure github io clojure clojure core api html clojure core reduced htt
  • PHP 7 上可以指定多个返回类型吗?

    我有一些可以返回的方法两种返回类型之一 我正在使用利用 MCV 的框架 因此重构这几个函数尤其没有吸引力 是否可以声明返回类型返回其中之一而在其他情况下失败 function test if this gt condition false
  • Clojure 中的快速素数生成

    我一直在努力解决欧拉计划 https projecteuler netClojure 中的问题得到了改善 我已经遇到过几次素数生成问题 我的问题是它花费的时间太长了 我希望有人能帮助我找到一种有效的方法 以 Clojure 的方式做到这一点
  • 如何在类型提示中定义元组或列表的大小

    有没有办法在参数的类型提示中定义元组或列表的大小 目前我正在使用这样的东西 from typing import List Optional Tuple def function name self list1 List Class1 if
  • Clojure 的映射和减少 Monad...Juxt Monad 怎么样?

    在学习 Clojure 的过程中 我花了很长时间试图理解 monad 它们是什么以及我们如何使用它们 但没有取得太大成功 然而 我发现了一个很棒的 Monads for Dummies 视频系列 http vimeo com 2071730
  • 如何解构向量以用作函数参数

    在 Python 中 您可以将列表或元组传递给函数并让函数解压参数 我怎样才能在 Clojure 中做到这一点 下面是一些 Python 代码示例 def f a b c d print a a print b b print c c pr
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以

随机推荐

  • 如何使用 Azure Blob 存储 SDK 将 Blob 从一个容器复制到另一个容器

    我一直在参考文档https learn microsoft com en us azure storage blobs storage quickstart blobs python 我无法找到将文件从一个容器复制 移动到另一个容器的正确
  • Swift 进度指示器图像蒙版

    首先 该项目是使用 Swift 构建的 我想创建一个自定义进度指示器 在脚本运行时 填满 该脚本将调用从远程服务器拉取的 JSON 提要 为了更好地形象化我所追求的 我做了这个 我的猜测是有两个 PNG 图像 一白一红 然后根据进度量简单地
  • 计算值用 R 改变符号的次数

    我对 R 还很陌生 但我对它很感兴趣 因为我发现它很容易使用 尽管我不是程序员 我试图解决以下问题 我需要计算列中值更改符号的次数 然后按路径对结果进行排序 下面是表格的示例 路径是一个因素 一旦我最终得到数据 我就可以计算出如何对数据进行
  • 在 Spring 应用程序的事务中使用 Async

    我有一个 Spring 应用程序 它使用以下命令更新 MySQL DB 中的特定实体详细信息 Transactional方法 并且在同一方法中 我尝试使用调用另一个端点 Async这是另一个 Spring 应用程序 它从 MySql DB
  • 如何使用ArrayList的get()方法

    我是 java 新手 也是 OOP 新手 我正在尝试了解 ArrayList 类 但我不明白如何使用 get 我尝试在网上搜索 但找不到任何有用的东西 这是官方文档ArrayList get 无论如何 这很简单 例如 ArrayList l
  • 加载图像时显示加载图标

    我想在 a 中显示背景图像 加载微调器div这将在其中加载图像 图像将在完全加载后显示 执行如下操作 div style background image none div 演示 jQuery 中 我如何使用 Angular2 Ionic2
  • 如何在 VBA 应用程序中隐藏代码

    Is it possible to hide VBA code normally accessible from Excel s VBA Editor Alt F11 from a user s prying eyes Can I for
  • 将数字四舍五入到前 3 位数字(以数字 != 0 开头)

    是否有一个预定义的格式函数可以将数字四舍五入到前 3 位数字 开头应该是数字 0 0 02528498 to 0 0253 1 857403 to 1 86 2060943 to 2060000 0 00006513832 to 0 000
  • 未加密的 SSL 协议?

    是否可以通过未加密的 https 发送消息 例如 要求进行证书验证和授权 但不加密通过套接字发送的实际数据 是的 TLS 和 SSL 支持 无加密 模式 所讨论的特定客户端和服务器是否配置为启用是一个单独的问题 服务器有可能默认启用这些密码
  • 将函数应用于 Spark DataFrame 的每一行

    我使用的是 Spark 1 3 我想对数据框的每一行应用一个函数 该函数对行的每一列进行哈希处理并返回哈希值列表 dataframe map row gt row toSeq map col gt col hashCode 当我运行此代码时
  • Visual Studio:重新启用“构建失败,运行上次成功?”对话框

    当构建失败时 VS 会弹出一个选项来运行上次成功的构建 有人在我的机器上单击了 是 和 不再显示此对话框 现在我仍坚持该设置 我怎样才能重置它 流程如下Visual Studio 2010及以上 但与以前的版本应该类似 在菜单栏上转到 To
  • 使用 Update 且 Upsert 为 true 时未设置默认值

    我为用户提供以下模型 var UserSchema new mongoose Schema name String dob Date sex String photo String email type String index uniqu
  • boost::interprocess::shared_ptr 线程安全(和进程间安全)吗?

    我想在线程之间共享数据 并在最后一个用户使用完数据后自动删除数据 大多数时候 这似乎有效 使用boost interprocess shared ptr in a boost fixed managed shared memory段 但并非
  • 使用@Preauthorize和@@ControllerAdvice自定义错误消息

    我们正在使用 spring 和 spring security 3 2 最近我们正在向 RestAPI 添加注释 PreAuthorize 之前它是基于 URL 的 PreAuthorize hasPermission salesorder
  • 将 getdate() 转换为 int

    当我运行以下查询时 select convert int getdate 我得到结果 41238 1 row s affected 有谁知道这是什么意思 这是我想的天数1 1 1900 sql server 保留从那时起的天数 尝试将该数字
  • 使用 Go 解析带有尾随逗号的 JSON 数组和映射元素时出现运行时错误

    Go 领域的主要主题专家之一 Dave Cheney 写道 当使用复合文字初始化变量时 Go 要求复合文字的每一行都以逗号结尾 甚至是声明的最后一行 这就是结果分号规则 然而 当我尝试将这个美丽的规则应用于 JSON 文本时 解析器似乎并不
  • 防止 HTML 表单操作被更改

    我的页面上有一个表单 用户可以在其中输入信用卡数据 是否可以在 HTML 中将表单的操作标记为常量 以防止恶意 JavaScript 更改表单的操作属性 我可以想象 XSS 攻击会更改表单 URL 使用户将其秘密数据发布到攻击者的站点 是否
  • 点击时隐藏 Twitter Bootstrap 导航折叠

    这不是一个子菜单下拉菜单 类别是 li 类 如图所示 通过从响应式菜单中选择一个类别 模板只是 一页 我想在点击时自动隐藏导航折叠 也可以漫步用作导航 因为模板只有一个 页 我寻求一个不影响它的解决方案 这里是HTML代码 菜单 div c
  • 使用 Apache 服务器运行 Silverlight(Linux 下)

    我需要将 Silverlight 2 0 应用程序部署到 Apache 服务器 但它是在 Linux 下 这可能吗 我的意思是 我需要在服务器中安装 Net 3 5 以及可以执行 Asp Net 的网站吗 谢谢你的帮助 如果 apache
  • defrecord 构造函数中未强制执行类型提示

    我使用创建了一个类型defrecord带有字段的类型提示 然而 我发现这些类型提示在构造函数中没有强制执行 我可以用它们做一些奇怪的事情 例如 请看下面的代码片段 user gt defrecord Person String name I