各种Clojure风格指南建议避免使用超过80个字符的行。我想知道是否有一种惯用的方法可以避免长String
个文字。
虽然这些日子通常有宽屏幕,但我仍然同意应该避免长线。
以下是一些例子(我很想跟随第一个例子):
;; break the String literal with `str`
(println (str
"The quick brown fox "
"jumps over the lazy dog"))
;; break the String literal with `join`
(println (join " " [
"The quick brown fox"
"jumps over the lazy dog"]))
我知道Clojure支持多行String
文字,但是使用这种方法会对新行字符的解释产生不良影响,例如:使用repl
:
user=> (println "The quick brown fox
#_=> jumps over the lazy dog")
The quick brown fox
jumps over the lazy dog
答案 0 :(得分:7)
您应该将字符串存储在外部文本文件中,然后从代码中读取该文件。如果您仍然觉得需要在代码中存储字符串,请继续使用str
。
编辑:
根据要求,我将演示如何在编译时读取长字符串。
(defmacro compile-time-slurp [file]
(slurp file))
像这样使用:
(def long-string (compile-time-slurp "longString.txt"))
您可以创建类似的宏来处理Java属性文件,XML / JSON配置,SQL查询,HTML或其他任何您需要的内容。
答案 1 :(得分:3)
我发现使用str
创建字符串并使用\newline
或\tab
而不是“\ n”等字符文字来打破它们很方便。
我很少以这种方式违反80栏规则。
答案 2 :(得分:3)
我所知道的最常用的方法如下:
1)使用(str)将字符串拆分为多行。
(str "User " (:user context)
" is now logged in.")
这可能是最惯用的用法。我已经在多个库和项目中看到过这种情况。它很快,因为(str)在引擎盖下使用StringBuilder。它还允许您透明地混合代码,就像我在示例中所做的那样。
2)当有意义时,允许字符串自行打破80个字符限制。
(format
"User %s is now logged in."
(:user context))
基本上,可以打破字符串的80字符限制。有可能你在使用代码时不太可能关心读取字符串,并且在你不需要的情况下,你需要水平滚动。
我在这里用(格式)包装了字符串,以便能够像我之前的例子一样注入代码。你不需要。
不太习惯的方式是:
3)将您的字符串放在文件中并从那里加载。
(slurp "/path/to/userLoggedIn.txt")
使用包含以下内容的文件:/path/to/userLoggedIn.txt
User logged in.
我建议不要这样做,因为:
我想说只有当你的文字真的大时才这样做。或者,如果非开发人员需要更改字符串的内容。或者如果内容是从外部获得的。
4)拥有一个命名空间,您可以在其中清除所有字符串,然后从那里加载它们。
(ns msgs)
(defn logged-in-msg [user]
(format
"User %s is now logged in."
user))
然后你可以这样使用:
(msgs/logged-in-msg (:user context))
我比#3更喜欢这个。你仍然需要允许在这里使用#2,在那里可以让字符串突破80 char限制。实际上,在这里你将字符串放在一行上,因此它们很容易格式化。如果使用checkstyle等代码分析,则可以从规则中排除此文件。它也没有遭受#3的问题。
如果您要使用#3或#4,您可能会为您的字符串设置一个特殊用例,例如国际化,或者有业务编辑等等。在这些情况下,您可能会更好地构建更强大的解决方案,这可以从上述方法中获得启发,或者使用专门用于这些用例的库。