137

私はこれで来ます:

(defn string->integer [str & [base]]
  (Integer/parseInt str (if (nil? base) 10 base)))

(文字列->整数 "10")
(文字列->整数 "FF" 16)

しかし、これを行うにはより良い方法である必要があります。

4

6 に答える 6

182

シグネチャのアリティが異なる場合、関数は複数のシグネチャを持つことができます。これを使用してデフォルト値を指定できます。

(defn string->integer 
  ([s] (string->integer s 10))
  ([s base] (Integer/parseInt s base)))

falsenilが両方とも非値と見なされると仮定すると、 に、またはさらに に(if (nil? base) 10 base)短縮できることに注意してください。(if base base 10)(or base 10)

于 2010-07-08T22:10:18.743 に答える
167

restClojure 1.2 [ ref ]以降、引数をマップとして分解することもできます。これにより、関数の引数に名前を付けてデフォルトを指定できます。

(defn string->integer [s & {:keys [base] :or {base 10}}]
    (Integer/parseInt s base))

今、あなたは呼び出すことができます

(string->integer "11")
=> 11

また

(string->integer "11" :base 8)
=> 9

https://github.com/Raynes/clavatar/blob/master/src/clavatar/core.clj (例

于 2011-12-28T20:21:23.057 に答える
0

マシューの提案と非常によく似たアプローチは、&残りの引数を実行せず、呼び出し元が柔軟な (およびオプションの) キーの単一の追加マップ引数を提供することを要求することです。

(defn string->integer [s {:keys [base] :or {base 10}}]
    (Integer/parseInt s base))

(string->integer "11" {:base 8})
=> 9

(string->integer "11" {})
=> 11

これには、オプションが単一の引数マップであり、呼び出し元が偶数個の余分な引数を渡すことにそれほど注意する必要がないという利点があります。さらに、リンターはこのスタイルでうまく機能します。編集者は、行ごとの引数のペアよりも、キーと値の表形式の配置をマップする方がうまくいくはずです (それが好きな場合)。

わずかな欠点は、オプションなしで呼び出された場合でも、空のマップを提供する必要があることです。

これについては、この位置引数セクション(Code Smells 記事) で触れています。

更新: Clojure 1.11では、オプションの引数のマップを渡すことがサポートされるようになりました( を使用&)。

于 2020-12-30T19:32:59.813 に答える