В Ruby "str" * 3
вы получите "strstrstr". В Clojure наиболее близким, о котором я могу думать, является (map (fn [n] "str") (range 3))
Есть ли более идиоматический способ сделать это?
Как повторить строку n раз в идиоматическом стиле clojure?
Ответ 1
Как насчет этого?
(apply str (repeat 3 "str"))
Или просто
(repeat 3 "str")
если вам нужна последовательность вместо строки.
Ответ 2
И еще одна забавная альтернатива, использующая протоколы:
(defprotocol Multiply (* [this n]))
Далее класс String расширен:
(extend String Multiply {:* (fn [this n] (apply str (repeat n this)))})
Итак, теперь вы можете "удобно" использовать:
(* "foo" 3)
Ответ 3
Вы также можете использовать функцию повторения от clojure.contrib.string. Если вы добавите это в свое пространство имен, используя, например,
(ns myns.core (:require [clojure.contrib.string :as str]))
затем
(str/repeat 3 "hello")
предоставит вам
"hellohellohello"
Ответ 4
Просто бросьте несколько более устрашающих и, надеюсь, продуманных решений.
user=> (clojure.string/join (repeat 3 "str"))
"strstrstr"
user=> (format "%1$s%1$s%1$s" "str")
"strstrstr"
user=> (reduce str (take 3 (cycle ["str"])))
"strstrstr"
user=> (reduce str (repeat 3 "str"))
"strstrstr"
user=> (reduce #(.concat %1 %2) (repeat 3 "str"))
"strstrstr"
Ответ 5
Или используйте функцию повтора, которая поставляется с clojure -contrib 'строковым пакетом. В этом случае вы можете использовать (clojure.contrib.string/repeat 3 "str" ), что приводит к "strstrstr".
Ответ 6
унидиоматическое решение: (т.е. НЕ КОГДА-ЛИБО ЭТО)
((fn [[x и xs]] (применить (eval x) xs)) (repeat 4 'str))