12

我正在尝试使用一个简单的 clojurescript 应用程序从 localStorage 中提取一个整数。我尝试过的所有事情最终都出现了某种错误行为。

下面是我的程序,没有从本地存储初始化。我将忽略 key not found 的情况,因为我有一个 JQuery 版本来处理它以启动存储。此外,JQuery 应用程序读取 ClojureScript 保存到 localStorage 很好。所以这对我有用。

快速总结是这样的。我的消息说“自上次事件以来已有 $number 天” $number 位于名为“counter”的 div 中。我有三个按钮;一个增加计数,一个减少计数,最后一个将计数重置为零。

 (ns days.core
        (:require [goog.events :as events]
                  [goog.string :as string]
                  [goog.math.Integer :as int]
                  [goog.dom :as dom]))
    (defn initial-state [] 0)
    (def count (atom (initial-state)))
    (defn set-counter [n]
       (do (.setItem (.localStorage (dom/getWindow)) "count" n)
           (dom/setTextContent (dom/getElement "counter") n)))
    (defn set-button-fn [button-id f-update]
       (events/listen (dom/getElement button-id)
                      "click"
                      (fn [] (do (f-update) (set-counter @count)))))
    (defn start-app []
       (do
           (set-counter @count)
           (set-button-fn "addDay" (fn [] (swap! count inc)))
           (set-button-fn "decDay" (fn [] (swap! count dec)))
           (set-button-fn "reset" (fn [] (reset! count 0)))))
    (start-app)

当我尝试使用 goog.math.Integer.fromString() 转换为整数时,对 inc 的调用将在末尾附加一个 1(7 转到 71 和 711)。对 dec 的调用将按照我的预期进行,以数字方式递减(711 变为 710 和 709)。这就是我尝试初始化它的方式。

(defn initial-state []
  (integer/fromString (.getItem (.localStorage (dom/getWindow)) "count")))

我意识到这是一个 goog.math.Integer 对象,所以我尝试调用 .toNumber() 。但是这个和 .toInt() 似乎给了我一个功能。函数 (){if(this.e==-1)return-w(this).D();else{for(var a=0,b=1,d=0;d=0?e:Ua+ e) b;b =Ua}return a}} 准确地说。

(defn initial-state [] (.toNumber 
  (integer/fromString (.getItem (.localStorage (dom/getWindow)) "count"))))

Clojure 似乎使用 java 的 Integer 类从字符串转换为 int 甚至到有 (int "1") 抛出的地步,所以这个想法被击中了。

我还尝试调用 javascript 的 parseInt()。这就是我在 JQuery 版本中的做法。但是,ClojureScript 调用始终返回 1。即使我的 JQuery 版本存储了 8,Chrome 的开发人员工具也证明了这一点。

(defn initial-state []
  (.parseInt (dom/getWindow)
             (.getItem (.localStorage (dom/getWindow)) "count")))

任何想法如何让该字符串值表现为整数?它必须很简单,但我无处可去。

4

3 回答 3

35

您可以通过 js 命名空间访问 parseInt 函数,如下所示:

(js/parseInt "7")
于 2011-07-28T08:36:36.293 回答
2

这是一个在 Clojure 和 ClojureScript 中都有效的方法:

(defn- str->int [s]
  #?(:clj (Integer/parseInt s)
     :cljs (js/parseInt s)))

(str->int "10")
> 10
于 2017-03-08T18:48:51.607 回答
0

ClojureScript 方式:

(ns reader-test.core
    (:require [cljs.reader :as reader]))

(reader/read-string "7") ;; 7 - integer
(reader/read-string "1.3") ;; 1.3 - non-integer number

这不仅适用于整数,也适用于任何类型。

于 2017-01-23T18:40:22.983 回答