14

「let」フォームの使い方を理解するのに苦労しています。以下の例では、後で関数内で作業するために、値「cols」をローカルにバインドしたいと考えています。ただし、「let」を使用すると、関数 sel-opt-tmp がリストではなく nil 値を返すことに気付きました。

(defn sel-opt-tmp []
  (let [cols "test"]))

(prn (sel-opt-tmp))

*上記のコードは nil 値を返します。

「let」は関数のスコープ内の値のみをバインドすることを理解していますが、let スコープの外に値を渡す方法があるかどうかはわかりません。もしかしたら、自分が気づいていない「返す」のようなものがあるのでは?それとも、これは単に悪い設計であり、この場合バインディングをまったく使用すべきではありません (これは、読みにくい関数の長いチェーンを作成する傾向があります)?

4

2 に答える 2

23

let ステートメントの内容が空 (または nil) であるため、nil を返します。試す:

(let [cols "test"] cols)

の値を返しますcols。seh が言うように、let ステートメントはその最後のサブ式の値に評価されます。

于 2011-11-18T16:45:00.170 に答える
3

あなたが言及したように、スコープ外に値を渡すことに関してそのような問題はありません。バインディングcolsスコープ内でのみ有効ですが、のの有効期間(:ks cols)は同様に制限されません。(これがガベージコレクションがある理由です。データを指す値を返すことができ、データへの参照がある限り、データは存続します。)

関数からnilを取得した場合、それはおそらくキーcolsがないことを意味し:ksます...または実際にはマップではない可能性があります。colsはの結果であるため、filterシーケンスであり、:ksキーワードを関数として使用すると、コレクション以外の場合はnilが返されます。この種のバグを防ぐために、マップと思われるものが別のものである場合にエラーが発生するように、(cols :ks)代わりに常に書き込むのが便利な規則かもしれません。(:ks cols)

于 2011-11-18T16:30:41.767 に答える