字符串的第一个字符的情况

4

我需要根据字符串的第一个字符做出决策,我定义了以下这个方法:

(defn check-first [string]
  (case (get string 0)
    "+" 1
    "-" 2
    3
    ))

目前,即使字符串以那些字符开头,它始终返回3。我做错了什么?此外,有没有更优雅的实现方式?

3个回答

13
(get "foo" 0)
;; => \f

(get "foo" 0)返回一个char而不是一个string,所以如果你想使用你的check-first,你需要用字符替换字符串。

(defn check-first [s]
  (case (first s) \+ 1, \- 2, 3))

顺便提一下,Clojure库编码规范建议在需要字符串输入的函数中使用s作为参数名称。
如果您更喜欢使用字符串而不是字符:(str (first "foo"))(subs "foo" 0 1)=> "f" 或者,可以编写一个case-indexed宏。
以下是一个快速的hack,不提供默认表达式选项:
(defmacro case-indexed [expr & clauses]
  (list* 'case expr (interleave clauses (iterate inc 1))))

;; (case-indexed "foo" "bar" "baz" "foo") => 3
;; (case-indexed (+ 5 1) 3 4 5 6 7) => 4

(defn check-first [s]
  (case-indexed (first s)
    \+, \-, \*, \/))

我不认为我会像这样分开子句 - 这只是为了使答案更简洁。 如果要使用此功能,我建议扩展“case-indexed”以包括默认表达式。此外,“check-first”似乎是一个过于通用的名称; 我没有更好的建议,但我会考虑更改它(假设它不是为了这个问题而创造的)。

3
你可以保留原有内容并在case条件中使用Java的substring方法:

您可以保留原有内容,并在case条件中使用Java的substring方法:

(defn check-first [s]
  (case (.substring s 0 1)
    "+" 1
    "-" 2
    3))

编辑:刚刚注意到MayDaniel已经提到了subs,它的用法与.substring相同。抱歉,这里还很早...


-3

您是不是想使用cond?

http://clojure-notes.rubylearning.org/

(def x 10)
(cond
(< x 0) (println "Negative!")
(= x 0) (println "Zero!"))
; => nil

(cond
(< x 0) (println "Negative!")
(= x 0) (println "Zero!")
:default (println "Positive!"))
; => Positive!

不,1)OP有一个字符串,而不是数字2)在这种情况下,使用case更为适当,特别是对于有限集合。 - Brad Koch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接