multipart/form-dataのバウンダリ文字列生成(その後)
この方がClojureっぽいよ!という指摘をいただきました。
github:gist
char-rangeのところはおいといて(w
確かに昨日のソースは
(defn generateBoundary [] (let [chars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"] (apply str "-------" (take 40 (repeatedly #(rand-nth chars))))))
にしたほうがよりClojureっぽいですね。
(rand-nth [coll])
はコレクションcollの中からn番目をランダムに選ぶ関数
(repeatedly f)
は関数fを無限回呼び出す遅延シーケンスを返す関数。
#(rand-nth [coll])
として無名関数化してrepeatedlyに渡している。
ただしこいつは
(repeatedly n f)
と書いて無限シーケンスの先頭要素n個を取ることもできるので
(defn generateBoundary [] (let [chars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"] (apply str "-------" (repeatedly 40 #(rand-nth chars)))))
のようにtakeを省略できる。
乱数については(rand-nth [coll])以外にも(rand-int n) (0〜n-1までの整数の乱数を返す)のもあるのでJavaのRandomのオブジェクトを生成して使わないでもよいケースも多そう。