String 检查clojure中的字符串是否以给定字符串结尾

String 检查clojure中的字符串是否以给定字符串结尾,string,clojure,String,Clojure,我创建了一个函数来检查我的第一个字符串是否以第二个字符串结尾 在Java中,我们有现成的方法来检查这一点,但在Clojure中,我没有找到这样的方法,因此我编写了如下自定义函数: (defn endWithFun [arg1 arg2] (= (subs arg1 (- (count arg1) (count arg2)) (count arg1)) arg2)) 产出: > (endWithFun "swapnil" "nil") true > (endWithFun

我创建了一个函数来检查我的第一个字符串是否以第二个字符串结尾

在Java中,我们有现成的方法来检查这一点,但在Clojure中,我没有找到这样的方法,因此我编写了如下自定义函数:

(defn endWithFun [arg1 arg2] 
    (= (subs arg1 (- (count arg1) (count arg2)) (count arg1)) arg2))
产出:

> (endWithFun "swapnil" "nil")
true
> (endWithFun "swapnil" "nilu")
false
这是预期的工作

我想知道,有没有类似的选择?
同样在我的案例中,我比较敏感。我还想忽略区分大小写。

您可以直接在Clojure中访问本机Java
endsWith

(.endsWith "swapnil" "nil")
有关更多详细信息,请参阅

然后,您可以自然地编写此文件,以获得不区分大小写的效果:

(.endsWith (clojure.string/lower-case "sWapNIL") "nil")

Clojure 1.8在中引入了一个以?函数结尾的
,因此现在有了一个本机函数:

> (ends-with? "swapnil" "nil")
true
> (ends-with? "swapnil" "nilu")
false

同样,如果你想不区分大小写,只需使用小写。

谢谢,这就是我一直在寻找的。现在我可以看到我可以使用
字符串
类的java api,通过使用
(.)
,我尝试了
(subs“swapbil”1 4)
(“swapnil”substring 1 4)
都提供了一个wap,如果我在clojure中使用java,性能会下降吗?或者两者都有相同的表现。我认为表现应该是可比的。如果您担心的话,您可以构建一个快速的微基准测试。一般来说,在Clojure中使用Java可能遭受的唯一性能损失是,如果在编译时无法推断对象的类,那么在运行时使用反射来查找方法。
clojure.string
函数都使用类型提示来避免反射,因此clojure和Java版本之间的性能差异应该可以忽略不计。感谢@kotarak的改进。@EmilSit欢迎您。事实上,新的符号被翻译成了旧的符号。在宏中,旧的有时非常有用。然而,在源代码中,新的看起来更像clojurey。类似:
(Constructor.abc)
(新构造函数abc)