記事ディレクトリ
1.数値型に渡す値を制限する
Clojure は動的に型指定される言語であるため、Clojure ではパラメーターを渡すための型制限はありません。これは、任意のタイプの値をパラメータとして渡すことができることを意味します。
パラメータの型を数値型に制限したい場合は、関数内の関数を使用してnumber?
パラメータの型を確認できます。
(defn my-func [x]
(if (number? x)
(println "参数是一个数字")
(println "参数不是一个数字")))
(my-func 10) ; 输出:参数是一个数字
(my-func "hello") ; 输出:参数不是一个数字
2.渡された複数の値が空でないかどうかを判断する
if
またはを使用して、 when
複数の値が空かどうかを判断し、対応する操作を実行します
(defn my-func [x y z]
(if (and (not (empty? x))
(not (empty? y))
(not (empty? z)))
(do
(println "调用方法的函数"))
(println "传值为空,请提供有效的参数")))
(my-func "a" "b" "c") ; 输出:调用方法的函数
(my-func "a" "" "c") ; 输出:传值为空,请提供有效的参数
my-func 関数は、3 つのパラメーター x、y、z を受け入れます。および を使用して、3 つのパラメータが同時に空かどうかを確認します。3 つのパラメーターがすべて空でない場合、do
コード ブロック内のコンテンツ、つまりメソッドを呼び出す関数が実行されます。それ以外の場合、「渡された値は空です。有効なパラメータを指定してください。」というプロンプト メッセージが出力されます。
empty?
ここでは、パラメータが空かどうかを判断するために関数が使用されていることに注意してください。empty?
関数は、文字列、リスト、ベクトル、セットなどが空かどうかをチェックできます。
他の型の値が空かどうかを判断する必要がある場合は、nil かどうかを判断するnil?
など。
3. 変数が真かどうかを判定する方法
関数を使用してtrue?
、変数が true かどうかを判断します。true?
この関数はパラメータを受け取り、true
orを返しますfalse
。パラメータが true の場合は true を返し、それ以外の場合は false を返します。
(true? true) ; 返回 true
(true? false) ; 返回 false
(def x 10)
(true? x) ; 返回 true,因为 x 的值不是 nil 或 false
(def y nil)
(true? y) ; 返回 false,因为 y 的值是 nil
注:true?
この関数はパラメーターが true であるかどうかのみを判断でき、空でない文字列やゼロ以外の数値など、他の値が true であるかどうかを判断することはできません。他の値が true かどうかを判断する必要がある場合は、関数を使用してnot
判断some
できます。
3. seq を使用して、ユーザーから渡された複数の値が空かどうかを判断します。
Clojure では、seq
関数を使用して複数の値が null かどうかを判断できます。seq
この関数はセットをシーケンス (シーケンス) に変換できます。セットが空の場合は を返しnil
、それ以外の場合は空ではないシーケンスを返します。
(defn my-func [x y z]
(if (seq [x y z])
(do
(println "调用方法的函数"))
(println "传值为空,请提供有效的参数")))
(my-func "a" "b" "c") ; 输出:调用方法的函数
(my-func "a" "" "c") ; 输出:传值为空,请提供有效的参数
注:seq
この関数は、セットが空かどうかのみを判断できます。
4. 値が空かどうかを判断する検証ループ
(defn process-values [values]
(if (empty? values)
(println "所有值都已处理完毕")
(let [first-value (first values)]
(if (empty? first-value)
(do
(println "值为空,请提供有效的参数")
(recur (rest values)))
(do
(println "处理值:" first-value)
(recur (rest values))))))
(process-values ["a" "b" "c"]) ; 输出:处理值: a,处理值: b,处理值: c,所有值都已处理完毕
(process-values ["a" "" "c"]) ; 输出:处理值: a,值为空,请提供有效的参数,处理值: c,所有值都已处理完毕
上記の例では、process-values
関数はvalues
、複数の値を含むコレクション (ベクトルなど) である という名前のパラメーターを受け入れます。この関数はまずvalues
空かどうかをチェックし、空の場合は「すべての値が処理されました」というプロンプトメッセージが出力されます。それ以外の場合は、firs
t 関数を使用してvalue
s の最初の値を取得し、それが空かどうかを判断します。空の場合は「値が空です。有効なパラメータを入力してください。」というプロンプトメッセージが出力され、recur
関数が使用されます。再帰process-values
次の値を処理する関数を呼び出します。空でない場合は、「プロセス値:」に現在の値を加えたものを出力し、recur
関数を使用してprocess-value
s 関数を再帰的に呼び出して次の値を処理します。
5. 否定演算
not
関数を使用してブール値を否定します。
(defn negate-value [value]
(if (not value)
(println "值为真")
(println "值为假")))
(negate-value true) ; 输出:值为假
(negate-value false) ; 输出:值为真
negate-value 関数は、value という名前のパラメーターを受け取り、not 関数を使用して値を否定します。値が true の場合は「値が false」を出力し、それ以外の場合は「値が true」を出力します。
6. マップ内にキーが存在するかどうかを確認します
contains?
関数を使用して、指定したキーが連想配列(マップ)に存在するかどうかを確認します
;;(contains? map key)
(def my-map {
:a 1 :b 2 :c 3})
(if (contains? my-map :a)
(println "Key :a exists in the map")
(println "Key :a does not exist in the map"))
(if (contains? my-map :d)
(println "Key :d exists in the map")
(println "Key :d does not exist in the map"))
キー a、:b、:c を含む連想配列 my-map が作成されます。次に、contains? 関数を使用して、キー :a と :d が my-map に存在するかどうかを確認します。
7.doallメソッドの利用
doall
関数は、強制的に評価し、シーケンスを消費するために使用されます。これは、シーケンスの結果を使用しないか無視する場合でも、シーケンス内のすべての要素が確実に評価されるようにすることを目的としています。
doall
この関数は次のように使用されます。
(doall coll)
coll
は必須の値のシーケンスです。
(def my-seq (range 10)) ; 创建一个序列
(def result (doall (map inc my-seq))) ; 对序列中的每个元素加1,并使用doall强制求值
(println result) ; 打印结果
上の例では、要素 0 ~ 9 を含むシーケンス my-seq を作成しました。次に、map
関数と inc 関数を使用して、シーケンス内の各要素に 1 を加算します。ただし、map
遅延評価されるため、シーケンスはすぐには評価されません。すべての要素が確実に評価されるように、doall
関数を使用してその結果を に保存しますresult
。result
最後に、値を出力します。
doall
この関数はシーケンス全体を強制的に評価するため、特にシーケンスが非常に大きい場合にパフォーマンスの問題が発生する可能性があることに注意してください。したがって、実際にシーケンス全体を評価する必要がある場合にのみ doall 関数を使用してください。
8. 取得したすべての情報をペーストボードに書き込みます
js/document.execCommand
方法
(defn write-to-clipboard [text]
(let [temp-textarea (.createElement js/document "textarea")]
(.setAttribute temp-textarea "readonly" "")
(set! (.-value temp-textarea) text)
(.appendChild js/document.body temp-textarea)
(.select temp-textarea)
(.execCommand js/document "copy")
(.removeChild js/document.body temp-textarea)))
;; 调用示例
(write-to-clipboard "这是要写入粘贴板的信息")