0

ここで次のコードを見ました

  (def token-store
      (redis-store/->RedisTokenStore secret-key 30 {:pool {} :spec {:host "127.0.0.1" :port 6379}}))

誰がこれが何を意味するのか説明できますか?

RedisTokenStore は、TokenStore プロトコルとそのメソッドを実装するレコードです。しかし、この構文は何を意味するのでしょうか。オブジェクトはこの構文でも作成できます。

(RedisTokenStore. secret-key 30 {:pool {} :spec {:host "127.0.0.1" :port 6379}})

では、このシンボル -> の違いは何ですか? ユーザー定義の名前空間の後にあるのはなぜですか?

私はマクロとして知っています、->はに使用されます

(-> 4 (+ 5)
      (- 6))

これは (- (+ 4 5) 6) に変換され、3 が得られます。

4

2 に答える 2

6

->RedisTokenStorerecord のファクトリ関数ですRedisTokenStore。レコードが定義されると、Clojure は自動的に定義します。

Clojure の公式データ型ドキュメントからの引用は次のとおりです。

deftype/defrecord Foo が定義されると、対応する関数 ->Foo が定義され、その引数がコンストラクターに渡されます (バージョン 1.3 以降のみ)。

したがって、コンストラクター->RedisTokenStoreを呼び出すだけのヘルパー関数です。RedisTokenStore.唯一の違いはimport RedisTokenStore、コンストラクターを明示的に呼び出すようにクラス化する必要があることです。 while->RedisTokenStoreは通常の関数であり、名前空間requireの一部として使用することができます。redis-store

更新: matxxx が彼の回答で指摘したようにmap->RedisTokenStore、マップを唯一の引数として取るファクトリ関数もあります。

于 2013-11-15T07:35:58.557 に答える