- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
false (Character/isWhitespace \ ) => -6ren">
Character/isWhitespace 的正确用法包括:
(Character/isWhitespace \a) => false
(Character/isWhitespace \ ) => true
但是,我的第一次尝试是这样的,我发现这个错误令人困惑。
(Character/isWhitespace "")
=> IllegalArgumentException No matching method found: isWhitespace
=> clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)
IllegalArgument
部分是有道理的,但为什么它说“找不到匹配的方法”?显然这个函数确实存在。
我问这个问题的原因是我是 Clojure 的新手,并且认为我从根本上误解了某些东西。
当我输入 (Character/isWhitespace\a)
时,我认为是说:“我知道有一个字符
命名空间,其中有一个名为 isWhitespace
的函数,我想调用该函数并传入 \a
”。
在这个心理模型上,我上面的结果令人困惑,因为 Clojure 似乎在说:“每当你给我一个该函数不接受的参数类型时,我就会假装该函数不存在。 ”例如,“你不允许混合砖 block ,所以如果你尝试,我会给你一个 BlenderDoesntExist 错误。”这很奇怪。
一些答案似乎暗示着这一点
Character/isWhitespace
只是 Clojure 用于查找函数的部分,另一部分是参数的类型。 (我做了更多搜索:这可能是一种多种方法吗?)一个很好的答案将为我澄清这个过程。
最佳答案
clojure 编译器依赖反射来查找 Java 互操作类方法的匹配签名,并且当找不到任何内容时,它会引发自己的异常。
在这种情况下,会正确引发 IllegalArgumentException
,但会显示 noMethodReport
错误消息,这会导致困惑。
和this is the source code responsible for it在 clojure
github 存储库上。
首先,Java 互操作解析演练。
当 clojure 解析器找到 .
点宏时,HostExpr
解析器会处理解析,并尝试确定第二个参数是符号还是类。
如果它是一个类,则假定它是被调用的该类的静态方法,并在 StaticMethodExpr
上继续解析。
解析器内的第一件事是尝试通过类的反射来查找方法:
List methods = Reflector.getMethods(c, args.count(), methodName, true);
if(methods.isEmpty())
throw new IllegalArgumentException("No matching method: " + methodName);
它正确找到了并且此时没有引发异常
然后它将参数添加到找到的方法中:
java.lang.reflect.Method m = (java.lang.reflect.Method) methods.get(i);
params.add(m.getParameterTypes());
之后尝试查找匹配的方法签名索引:
methodidx = getMatchingParams(methodName, params, args, rets);
在这种情况下返回“-1”并且method
保持为空。这就是解析阶段。
评估时间...
然后,当调用 invokeStaticMethod
时,它会在 Reflector.java
上调用 getMethods
,从而正确找到“isWhitespace”的两个匹配签名。
最后是您在函数内部看到的令人困惑的消息:
static Object invokeMatchingMethod(String methodName, List methods, Object target, Object[] args)
对找到的方法进行参数匹配测试,试图找到具有正确签名的方法:
for(Iterator i = methods.iterator(); i.hasNext();)
{
m = (Method) i.next();
Class[] params = m.getParameterTypes();
if(isCongruent(params, args))
如果没有找到匹配的签名,则会引发异常
if(m == null)
throw new IllegalArgumentException(noMethodReport(methodName,target));
因此,答案是 clojure 编译器依赖反射来查找方法的匹配签名,并且当找不到任何内容时,它会引发自己的异常。
在这种情况下,会正确引发 IllegalArgumentException
,但会显示 noMethodReport
错误消息,这会导致困惑。
关于clojure - 为什么 Clojure 会说 "no matching method"表示非法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590432/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!