请在2024 Clojure状态调查!分享一下您的想法。

欢迎!请在关于页面了解更多关于该功能的信息。

0
Clojure

string/last-index-of也是这样。今天我遇到了一个因缺乏这些而引发的反射警告。添加它们似乎是很有用的。

1 答案

+3
 
最佳答案

考虑到它可以返回nil,这样的类型提示是否甚至正确?

在Clojure/Java中创建该函数之初,曾考虑将返回值类型提示为long,但最终被否决,以保留在某些情况下函数返回nil的能力。参见Stu Halloway关于此票证的笔记:https://clojure.atlassian.net/browse/CLJ-1449
您是在说Java中所有返回类型为X的方法永远不会返回null吗?对于原始类型来说,我想这是真的,但通常并非如此。如果你返回nil,仍然添加类型提示会出错吗?
这个答案只是REPL,几秒钟的事

$ clj
Clojure 1.10.1
user=> (defn foo ^long [x] (if (> x 5) (inc x) nil))
#'user/foo
user=> (foo 6)
7
user=> (foo 7)
8
user=> (foo 3)
执行错误(NullPointerException)在用户/foo(REPL:1)。
null
user=> (pst)
NullPointerException
    用户/foo(NO_SOURCE_FILE:1)
    用户/foo(NO_SOURCE_FILE:-1)
    用户/eval141(NO_SOURCE_FILE:1)
    用户/eval141(NO_SOURCE_FILE:1)
    clojure.lang.Compiler.eval(Compiler.java:7177)
    clojure.lang.Compiler.eval(Compiler.java:7132)
    clojure.core/eval(core.clj:3214)
    clojure.core/eval(core.clj:3210)
    clojure.main/repl/read-eval-print--9086/fn--9089(main.clj:437)
    clojure.main/repl/read-eval-print--9086(main.clj:437)
    clojure.main/repl/fn--9095(main.clj:458)
    clojure.main/repl(main.clj:458)
nil
是的,所以

user=> (defn ^long index-of [^String s ^String substring] (let [i (.indexOf s substring)] (when (nat-int? i) i)))
#'user/index-of
user=> (index-of "foo" "f")
0
user=> (index-of "foo" "x")
执行错误(NullPointerException)在用户/index-of(REPL:1)。
null
...