有沒有辦法將字段訪問器轉換爲函數?我真的很驚訝,當我試圖做到這一點字段訪問器作爲clojure中的函數?
(map .x [o1 o2])
而是不得不這樣做
(defn x [o] (.x o))
(map x [o1 o2])
這似乎是相當必要的。有沒有辦法爲你創建這個功能?
有沒有辦法將字段訪問器轉換爲函數?我真的很驚訝,當我試圖做到這一點字段訪問器作爲clojure中的函數?
(map .x [o1 o2])
而是不得不這樣做
(defn x [o] (.x o))
(map x [o1 o2])
這似乎是相當必要的。有沒有辦法爲你創建這個功能?
你可以寫你自己的凌晨宏生成匿名函數:
(defmacro field [m] `(fn [x#] (. x# ~m)))
然後,例如,
((field x) (java.awt.Point. 3 5))
;3
謝謝!我從未寫過一個宏。這應該是標準的。 – 2014-09-26 05:18:59
使用匿名fn
(map #(.x %) [o1 o2])
(map (fn [o] (.x o)) [o1 o2])
或者
memfn - 我讀過的一個匿名
fn
優於此。我會盡力找到這篇文章。
(map (memfn x) [o1 o2])
編輯:斯圖哈洛韋有
this談談
memfn
在memfn中,我得到'No matching method found found:x for class ...' – 2014-09-24 16:58:10
另外「x」是一個字段而非方法。 – 2014-09-24 17:00:51
@CristianGarcia我沒注意到。抱歉! – Kyle 2014-09-24 17:05:25
這是必要的,因爲字段不是jvm中的第一類對象,所以它們不能作爲參數提供給函數。爲了自動生成一個函數,你需要知道在編譯時哪個類的訪問者將被應用。 – noisesmith 2014-09-24 18:19:36