首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure koans 14 -将映射转换为字符串

Clojure koans 14 -将映射转换为字符串
EN

Code Review用户
提问于 2015-01-16 13:45:14
回答 1查看 672关注 0票数 -2

考恩就在这段片段的末尾。它要求您编写一个函数来将一个映射转换为一个字符串,然后在它前面加上一个全名。

下面的解决方案运行良好。我只是想知道是否有更简单或更有效的方法来做同样的事情。

代码语言:javascript
复制
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Solution
(defn str-addr [addr]
  "Turn a map of address into a string in the format of STREET, CITY, STATE"
  (let [{:keys [street-address city state]} addr]
    (str street-address ", " city ", " state)
    )
  )
(defn prefix-name-to-addr [[fn ln] addr]
  "Prepend names to an address."
  (let [
        name-string (str fn " " ln)
        addr-string (str-addr addr)
        ]
    (str name-string ", " addr-string)
    )
  )
; (prefix-name-to-addr ["Victoria" "Leong"] test-address)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(def test-address
  {:street-address "123 Test Lane"
   :city "Testerville"
   :state "TX"})

"All together now! Fill in a function to make the follow expression eval to true."
(= "Test Testerson, 123 Test Lane, Testerville, TX"
   (prefix-name-to-addr ["Test" "Testerson"] test-address))
EN

回答 1

Code Review用户

发布于 2015-01-17 11:48:40

性能在这里不是一个问题,只是没有足够的工作来使这成为一个关注。由于同样的原因,这篇评论也太过分了,所以如果您想在一个比大约20行更大的程序中使用这段代码,我将讨论应该更改的内容。我的命名建议可能不是习以为常的,我不知道。

因此,就风格而言,首先要注意的是,括号不应该像这样单独使用。如果您的编辑器使它变得困难,获得一个将自动保持结构正确和缩进正确。

接下来,str-addr的docstring缺少一个句号,单个字符串("All together now! ..")每行超过80个字符。

我不喜欢缩写。addraddress略短,但实际上,str-addr并不是最容易破译的。

现在这个函数所做的并不是将一个地址真正地转换成一个字符串(不是一个地址的映射,这个程序中的一个地址被隐含地定义为一个包含(至少) street-addresscitystate三个字段的映射,所以把它当作一种数据类型对待),而是格式化它以供人工显示。所以更好的名字应该是format-addressprint(able)-addressreadable-address等等。

您可以使用map甚至juxt直接提取字段,而不是析构。这将节省该函数中的另一行,而代价是使用关键字指定字段。

然后,使用join from clojure.string将字符串与分隔符连接起来,如果您有更多的参数,则会更加简洁。如果您有更复杂的格式,请使用format

prefix-name-to-address可以建议它将一个prefix-name转换成一个地址--我可能会使用一个完全不同的名称。它所做的是格式化一个完整的地址行,所以类似于format-full-address。另外,您的名称数据类型,一个向量,在这里是非常有限的。至少,通过不限制一个人可以拥有的名字的数量,你会变得更加灵活,同时代码也会更小。

因此,如果我将这些建议合并到代码中,则如下所示:

代码语言:javascript
复制
(use 'clojure.string)

(defn format-address [address]
  "Turn an address into a string in the format of 'STREET, CITY, STATE'."
  (join ", " (map address [:street-address :city :state])))

(defn format-name [name]
  "Turn a name (a sequence of first name to last name) into a string."
  (join " " names))

(defn format-full-address [name address]
  "Prepend a name to an address."
  (join ", " [(format-name name) (format-address address)]))

(def test-address
  {:street-address "123 Test Lane"
   :city "Testerville"
   :state "TX"})

;; All together now! Fill in a function to make the follow expression eval to true.
(= "Test Testerson, 123 Test Lane, Testerville, TX"
   (format-full-address ["Test" "Testerson"] test-address))
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/77711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档