作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Clojure 中创建一个具有属性和方法的对象,我读到 gen-class 和 proxy 可以完成我需要的工作,但它的实现对我来说非常困惑。
我想使用代理来避免 AOT 编译步骤,我阅读了它,但我最好学习如何使用两者中更容易的一个
这是我想在 Clojure 中做的事情
Java代码:
public class MyClass {
public float myFloat;
MyClass( float _myFloat ) {
myFloat = _myFloat
}
public void showNumber() {
println( myFloat );
}
}
(deftype Particle [x y]
Object
(render [this]
(no-stroke)
(fill 200 30 180)
(ellipse x y 200 200)))
(defprotocol ParticleProtocol
(update [this])
(render [this]))
(deftype Particle [position]
ParticleProtocol
(update [this])
(render [this]
(no-stroke)
(fill 200 30 180)
(ellipse (.x position) (.y position) 20 20)))
最佳答案
我同意 deftype
(或可能 defrecord
)优于 proxy
在 Clojure 中执行此操作,但请参阅最后的评论以考虑所有可能性。
对于更新 2 之后的问题。
您可以通过在 arglist 中指定它们来将“属性”添加到记录:
(deftype Particle [position radius prop3 prop4]
...
)
(defn make-particle
([position] (Particle. position nil nil nil))
([position radius] (Particle. position radius nil nil))
;; etc. add more here as needed
)
(def mymap {:myfloat 3.1415926})
(println "myfloat has value:" (:myfloat mymap))
;; the details are bogus, just showing the syntax
(defn render [m]
(no-stroke)
(fill (:radius m) (:position m))
(do-something-else (:position m)))
update
,如果您打算更新粒子贴图中的值,那么您需要创建一个新贴图,而不是更新现有贴图。
(def myparticle {:position 100 :radius 25})
(defn change-pos [particle-map new-pos]
(assoc-in particle-map [:position] new-pos))
(let [new-particle (change-pos myparticle 300)]
(println new-particle))
;; prints out {:position 300 :radius 25}
;; orig myparticle still has value {:position 100 :radius 25}
;; or do it directly
(println (assoc myparticle :position 300))
;; prints out {:position 300 :radius 25}
关于clojure - 如何使用 Clojure 代理制作类 java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15459877/
我是一名优秀的程序员,十分优秀!