4

Clojure と Reagent は初めてです。アトム変数の連絡先内で最初に変数を出力する方法を教えてください。

(def アプリ状態 (r/atom {:contacts [{:first "Ben" :last "Lem" :middle "Ab"}]}))

4

4 に答える 4

2

Clojure の(get-in m ks)関数を使用して、探している値にアクセスする簡潔な方法を次に示します。

(get-in @app-state [:contacts 0 :first])
于 2016-01-28T06:49:55.603 に答える
2

まず第一に試薬のチュートリアルは、開始するのに非常に適した場所です。この問題を正確に解決するための例も提供します。

試薬atomは通常の Clojurescript アトムと同じように扱うことができるため、通常のシーケンス操作をすべて使用できます。現在の値にアクセスするには、 を介してアトムを逆参照する必要があることに注意し@てください。本当にアトムの最初の値にアクセスしたい:first場合:

(:first (first (:contacts @app-state)))また(get (first (get @app-state :contacts)) :first)

または、より読みやすいと思われる場合

(-> @app-state
    :contacts
    first
    :first)

あなたがやりたいことは、次のようなアクセスをより簡単にするためにいくつかの関数を定義することだと思います:

(defn get-contacts!
  "Returns the current vector of contacts stored in the app-state."
  []
  (:contacts @app-state))

(defn get-first-names!
  "Return a vector of all first names in the current list of contacts in the
   app-state."
  []
  (mapv :first (get-contacts!)))

試薬では(そして一般的には) そのアトムをできるだけ何度も参照解除したい場合があるので、参照解除するのに適した場所を探して、原子の代わりに単純なシーケンスで動作する通常の関数を使用することを覚えておいてください。 .

それでも、前述の試薬のチュートリアルを読むことを強くお勧めします。

于 2016-01-26T13:52:20.527 に答える
1

おまけとして、これは次のように書かれていることがよくあります。

(->> @app-state
     :contacts
     (mapv :first)
     first

ここで何が起こっているのかを理解することは役に立ちます。

->>上記のコードを次のように書き換える thread-last というマクロ

(first (mapv :first (:contacts @app-state)))

スレッド ラストは最初は少し奇妙ですが、多くのことが行われているときにコードが読みやすくなります。他のコメントで言及されている試薬のチュートリアルに加えて、これを読むことをお勧めします。

于 2016-01-26T16:06:29.360 に答える