Kar*_*tik 3 clojure java.util.concurrent
以下作品。结果是“你好世界”
(def ^Callable f (fn [] "hello world"))
(let [e (java.util.concurrent.Executors/newSingleThreadExecutor)]
(try
(.get (.submit e f))
(finally (.shutdown e))))
Run Code Online (Sandbox Code Playgroud)
但以下没有。结果get
是nil
(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
(.get (.submit e f))
Run Code Online (Sandbox Code Playgroud)
为什么?我f
通过用有副作用的东西替换它来检查它是否被调用。我能看到的唯一区别e
是let
在一个和def
另一个中绑定使用。
另一个问题。如果我没有第一个示例的类型^Callable
提示,f
则悄悄地返回nil
. 它不应该为提交调用抛出异常“找到一个以上的匹配方法”,因为f
两者都是Runnable
和Callable
?如果我像下面这样定义f
使用let
,则抛出异常
(let [e (java.util.concurrent.Executors/newSingleThreadExecutor)]
(let [f (fn [] "hello world2")]
(try
(.get (.submit e f))
(finally (.shutdown e)))))
Run Code Online (Sandbox Code Playgroud)
谢谢
问题是e
无法推断的类型
(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
Run Code Online (Sandbox Code Playgroud)
当我将其更改为
(def ^java.util.concurrent.ExecutorService e (java.util.concurrent.Executors/newSingleThreadExecutor))
Run Code Online (Sandbox Code Playgroud)
然后(.get (.submit e f))
给出正确的答案"hello world"
。当e
使用 a 定义时,clojure 以某种方式推断正确的类型let
,因此不需要类似的类型提示。
设置*warn-on-reflection*
来true
帮助调试这个。
归档时间: |
|
查看次数: |
342 次 |
最近记录: |