相关疑难解决方法(0)

这是封闭吗?如果是这样,为什么?

在准备另一个问题的答案时,我为自己创建了一个.考虑以下简短程序.

(ns net.dneclark.JFrameAndTimerDemo
  (:import (javax.swing JLabel JButton JPanel JFrame Timer))
  (:gen-class))

(defn timer-action [label counter]
 (proxy [java.awt.event.ActionListener] []
   (actionPerformed
     [e]
      (.setText label (str "Counter: " (swap! counter inc))))))

(defn timer-fn []
  (let [counter (atom 0)
        label (JLabel. "Counter: 0")
        timer (Timer. 1000 (timer-action label counter))
        panel (doto (JPanel.)
                (.add label))]
    (.start timer)
    (doto (JFrame. "Timer App")
      (.setContentPane panel)
      (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
      (.setLocation 300 300)
      (.setSize 200 200)
      (.setVisible true))))

(defn -main []
  (timer-fn))
Run Code Online (Sandbox Code Playgroud)

在动作监听器'timer-action'中,'counter'参数的值被改变.实际变量在'timer-fn'函数中声明,但在侦听器中被更改.在我之前使用像Pascal这样的语言的经验中,我会认为'counter'可以通过引用传递.这是这种情况还是这个闭包的例子?别的什么?

谢谢您的帮助.

closures clojure

6
推荐指数
1
解决办法
364
查看次数

标签 统计

clojure ×1

closures ×1