ループの途中でreturn(break)したい
気が付いたら前回のポストからすでに2年弱。早いもんですね。。。。
Pythonでいうところの
objs = [{"a": 1, "text": "test 1 message"}, {"a": 2, "text": "test 2 message"}, {"a": 3, "text": "test 3 message"}] for o in objs: if o["a"] == 3: return o
こんなことをClojureで実現したかったので考えてみたけど こんなのしか浮かばなかった。
user> (def objs [{:a 1 :text "test 1 message"} {:a 2 :text "test 2 message"} {:a 3 :text "test 3 message"}]) #'user/objs user> (loop [o objs] (when-not (empty? o) (if (= 3 (-> o first :a)) ;; ここの3を変える (-> o first) (recur (rest o)))))
pythonで3行なんだし、もうちょっと縮められないかまた考えておこう。
それにしても、よくこんなことも知らずに今までやってこれてきたもんだ。
2018-04-03 追記
id:ayato0211 あやぴーさん曰く、この例程度であれば filter + first でも良いとのこと。
(first (filter #(= 3 (:a %)) objs))
やっぱ、clojure使ってる人はこっちの方がわかりやすかったりするのかな?
あと、reduce/reducedなんてのもあるらしい。
(reduce #(if (= (:a %2) 3) (reduced %2)) nil objs)
あやぴーさん、ありがとうございます。とても勉強になりました。 m(_ _)m