首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >颠倒字符串(简单问题)

颠倒字符串(简单问题)
EN

Stack Overflow用户
提问于 2011-09-19 18:24:45
回答 2查看 5.8K关注 0票数 20

在Clojure中有没有更好的方法来做到这一点?

代码语言:javascript
复制
daniel=> (reverse "Hello")
(\o \l \l \e \H)

daniel=> (apply str (vec (reverse "Hello")))
"olleH"

每次要将字符串还原为其原始形式时,是否都需要执行apply $ str $ vec

EN

回答 2

Stack Overflow用户

发布于 2011-09-19 21:30:11

好的,所以使用apply inside来滚动你自己的函数会很容易,或者使用专门的reverse版本,它在字符串上工作得更好(但只是这样)。不过,这里要考虑的主要问题是str函数的数量(参数的数量和类型),以及反向在集合上工作的事实。

代码语言:javascript
复制
(doc reverse)

clojure.core/reverse
([coll])
Returns a seq of the items in coll in reverse order. Not lazy.

这意味着reverse不仅适用于字符串,也适用于所有其他集合。但是,因为reverse需要一个集合作为参数,所以它将字符串视为字符的集合

代码语言:javascript
复制
(reverse "Hello")

,并同时返回一个

代码语言:javascript
复制
(\o \l \l \e \H)

现在,如果我们只用函数代替集合,您就可以发现不同之处:

代码语言:javascript
复制
(str '(\o \l \l \e \H) )
"(\\o \\l \\l \\e \\H)"

代码语言:javascript
复制
(str \o \l \l \e \H )
"olleH"

两者之间的最大区别在于参数的数量。在第一个示例中,str接受一个参数,即5个字符的集合。在第二个示例中,str接受5个参数:5个字符。

str函数期望什么?

代码语言:javascript
复制
(doc str)
-------------------------
clojure.core/str
([] [x] [x & ys])
  With no args, returns the empty string. With one arg x, returns
  x.toString().  (str nil) returns the empty string. With more than
  one arg, returns the concatenation of the str values of the args.

因此,当您提供一个参数(集合)时,所有字符串返回都是该集合的toString。但是为了得到您想要的结果,您需要将这5个字符作为单独的参数提供给str,而不是集合本身。Apply是用于“进入”集合并实现该操作的函数。

代码语言:javascript
复制
(apply str '(\o \l \l \e \H) )
"olleH"

处理多个独立参数的函数经常出现在Clojure中,因此最好了解何时以及为什么需要使用apply。另一方面要认识到的是,为什么str函数的编写者让它接受多个参数而不是一个集合?通常,有一个很好的理由。str函数的流行用例是什么?当然不是连接独立字符的集合,而是连接值、字符串和函数结果。

代码语言:javascript
复制
(let [a 1 b 2]
  (str a "+" b "=" (+ a b)))
"1+2=3"

如果我们有一个接受单个集合作为参数字符串会怎样呢?

代码语言:javascript
复制
(defn str2
  [seq]
  (apply str seq)
  )

(str2 (reverse "Hello"))
"olleH"

酷,它起作用了!但现在:

代码语言:javascript
复制
(let [a 1 b 2]
  (str2 '(a "+" b "=" (+ a b)))
  )
"a+b=(+ a b)"

嗯,现在该怎么解决呢?:)

在这种情况下,让str接受在执行str函数之前计算的多个参数,这将为str提供最简单的语法。无论何时需要在集合上使用str,apply都是将集合转换为单独参数的一种简单方法。

创建一个接受集合并计算其中每个部分字符串将花费更多的精力,只在不太常见的用例中有帮助,导致更复杂的代码或语法,或者限制它的适用性。因此可能有一种更好方法来反转字符串,但是reverse、apply和str在这方面做得最好。

票数 19
EN

Stack Overflow用户

发布于 2011-09-19 19:09:12

Apply和reverse一样,适用于任何可排序的类型,而不仅仅是向量,因此

(应用字符串(反转"Hello"))

稍微短了一点。不过,clojure.string/reverse应该更有效。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7469449

复制
相关文章

相似问题

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