12

単純なclojurescriptアプリを使用してlocalStorageから整数を取得しようとしています。私が試したものはすべて、ある種の間違った動作をします。

以下は、ローカルストレージから初期化しない私のプログラムです。ストレージを準備するためにそれを処理するJQueryバージョンがあるので、キーが見つからない場合は無視します。また、JQueryアプリはClojureScriptがlocalStorageに保存したものを正常に読み取ります。だからそれは私のために働いています。

簡単な要約はこれです。「前回のインシデントから$number日が経過しました」というメッセージが表示されます。$numberは「counter」という名前のdivにあります。ボタンが3つあります。1つはカウントをインクリメントし、1つはカウントをデクリメントし、最後はカウントをゼロにリセットします。

 (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()は私に関数を与えるようでした。function(){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}returna}}正確には。

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

Clojureは、javaのIntegerクラスを使用して、文字列からintにキャストし、(int "1")をスローして、アイデアが発砲されたようです。

また、javascriptのparseInt()を呼び出そうとしました。これは私がJQueryバージョンでそれを行う方法です。ただし、ClojureScript呼び出しは常に1を返します。Chromeの開発者ツールで証明されているように、私のJQueryバージョンが8を格納している場合でも。

(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 に答える