উত্তর:
স্বাক্ষরগুলি আরটিতে পৃথক হলে কোনও ফাংশনে একাধিক স্বাক্ষর থাকতে পারে। আপনি এটি ডিফল্ট মান সরবরাহ করতে ব্যবহার করতে পারেন।
(defn string->integer
([s] (string->integer s 10))
([s base] (Integer/parseInt s base)))
নোট করুন যে ধরে নেওয়া false
এবং nil
উভয়ই অ-মান হিসাবে বিবেচিত (if (nil? base) 10 base)
হয় (if base base 10)
, এটি সংক্ষিপ্ত করা যেতে পারে বা আরও কিছুতেও হতে পারে (or base 10)
।
recur
কেবল একই তাত্পর্য নিয়ে কাজ করে। যদি আপনি উপরে পুনরাবৃত্তি করার চেষ্টা করেন, উদাহরণস্বরূপ:java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:
(string->integer s 10)
)?
rest
ক্লোজুর ১.২ [ রেফ ] থেকে আপনি মানচিত্র হিসাবে আর্গুমেন্টগুলিও গঠন করতে পারেন । এটি আপনাকে ফাংশন আর্গুমেন্টগুলির জন্য নাম এবং ডিফল্ট সরবরাহ করতে দেয়:
(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 (উদাহরণস্বরূপ)
এই সমাধানটি মূল সমাধানের স্পিরিটের কাছাকাছি , তবে মার্জিনাল ক্লিনার
(defn string->integer [str & [base]]
(Integer/parseInt str (or base 10)))
একটি অনুরূপ প্যাটার্ন যা হাতের ব্যবহারের or
সাথে মিলিত হতে পারেlet
(defn string->integer [str & [base]]
(let [base (or base 10)]
(Integer/parseInt str base)))
এই ক্ষেত্রে আরও ভার্বোজ থাকাকালীন, যদি আপনি অন্যান্য ইনপুট মানগুলির উপর ডিফল্ট নির্ভর করতে চান তবে এটি কার্যকর হতে পারে । উদাহরণস্বরূপ, নিম্নলিখিত ফাংশনটি বিবেচনা করুন:
(defn exemplar [a & [b c]]
(let [b (or b 5)
c (or c (* 7 b))]
;; or whatever yer actual code might be...
(println a b c)))
(exemplar 3) => 3 5 35
এই পদ্ধতির নাম হিসাবে যুক্তি (এম। গিলিয়ার সমাধান হিসাবে) কাজ করে সহজেই প্রসারিত করা যেতে পারে :
(defn exemplar [a & {:keys [b c]}]
(let [b (or b 5)
c (or c (* 7 b))]
(println a b c)))
অথবা আরও বেশি ফিউশন ব্যবহার করে:
(defn exemplar [a & {:keys [b c] :or {b 5}}]
(let [c (or c (* 7 b))]
(println a b c)))
or
or
থেকে ভিন্ন :or
যেহেতু or
পার্থক্য জানে না nil
এবং false
।
আপনি বিবেচনা করতে চাইতে পারেন এমন আরও একটি পদ্ধতি রয়েছে: আংশিক ফাংশন। এগুলি কার্যকারিতার জন্য ডিফল্ট মানগুলি নির্দিষ্ট করার জন্য একটি আরও "কার্যকরী" এবং আরও নমনীয় উপায়।
আপনি যদি অগ্রণী পরামিতি হিসাবে ডিফল্ট (গুলি) সরবরাহ করতে চান যে পরামিতি রয়েছে এমন একটি ফাংশন তৈরি করে (প্রয়োজনে) তৈরি শুরু করুন:
(defn string->integer [base str]
(Integer/parseInt str base))
এটি করা হয়েছে কারণ ক্লোজুরের সংস্করণ partial
আপনাকে ফাংশন সংজ্ঞাতে প্রদর্শিত ক্রম অনুযায়ী "ডিফল্ট" মানগুলি সরবরাহ করতে দেয়। প্যারামিটারগুলি পছন্দসই হিসাবে অর্ডার হয়ে গেলে আপনি ফাংশনটি ব্যবহার করে partial
ফাংশনের একটি "ডিফল্ট" সংস্করণ তৈরি করতে পারেন :
(partial string->integer 10)
এই ফাংশনটি একাধিকবার কলযোগ্য করার জন্য আপনি এটি ব্যবহার করে এটি কোনও ভারে ফেলতে পারেন def
:
(def decimal (partial string->integer 10))
(decimal "10")
;10
আপনি এটি ব্যবহার করে একটি "স্থানীয় ডিফল্ট" তৈরি করতে পারেন let
:
(let [hex (partial string->integer 16)]
(* (hex "FF") (hex "AA")))
;43350
আংশিক ফাংশন পদ্ধতির অন্যদের কাছে একটি মূল সুবিধা রয়েছে: ফাংশনের গ্রাহক এখনও ফাংশন সংজ্ঞা পরিবর্তনের প্রয়োজন ছাড়াই ফাংশনের নির্মাতার চেয়ে ডিফল্ট মান কী হবে তা সিদ্ধান্ত নিতে পারে । এটি যেখানে উদাহরণস্বরূপ যেখানে আমি স্থির করেছি যে ডিফল্ট ফাংশনটি আমি চাই তা নয় examplehex
decimal
এই পদ্ধতির আরেকটি সুবিধা হ'ল আপনি ডিফল্ট ফাংশনটিকে একটি ভিন্ন নাম (দশমিক, হেক্স, ইত্যাদি) নির্ধারণ করতে পারেন যা আরও বর্ণনামূলক এবং / অথবা আলাদা স্কোপ (ভের, স্থানীয়) হতে পারে। আংশিক ফাংশনটি যদি ইচ্ছা হয় তবে উপরের কয়েকটি পদ্ধতির সাথে মিশ্রিত করা যেতে পারে:
(defn string->integer
([s] (string->integer s 10))
([base s] (Integer/parseInt s base)))
(def hex (partial string->integer 16))
(নোট করুন এটি ব্রায়ানের উত্তর থেকে কিছুটা পৃথক কারণ প্যারামিটারগুলির ক্রম এই প্রতিক্রিয়াটির শীর্ষে প্রদত্ত কারণে বিপরীত হয়েছে)
আপনি https://clojuredocs.org/clojure.core/fnil এও দেখতে পারেন(fnil)
(recur s 10)
করে দ্বিতীয় পংক্তিতে বলা ভাল হবে । এটি ভবিষ্যতে ফাংশনটির নামকরণ করা আরও সহজ করে তুলবে। কেউ কি এই পরিস্থিতিতে এই পরিস্থিতিতে ব্যবহার না করার কোন কারণ জানেন ?recur
string->integer
recur