स्पेशल फॉर्म with ऐसे कई चरणों की शृंखला को संभालने का तरीका देता है, जिनमें से कोई भी चरण असफल हो सकता है। यह तरीका आपको "सब कुछ ठीक चलने वाले रास्ते" पर ध्यान लगाने और असफलताओं को बाद में संभालने देता है।
with {:ok, id} <- get_id(username),
{:ok, avatar} <- fetch_avatar(id),
{:ok, image_type} <- check_valid_image_type(avatar) do
{:ok, image_type, avatar}
else
:not_found ->
{:error, "invalid username"}
{:error, "not an image"} ->
{:error, "avatar associated to #{username} is not an image"}
err ->
err
end
हर चरण पर, अगर कोई क्लॉज़ मैच हो जाता है, तो शृंखला तब तक चलती रहती है जब तक कि do ब्लॉक चल न जाए। अगर कोई एक मैच असफल हो जाए, तो शृंखला रुक जाती है और जो क्लॉज़ मैच नहीं हुआ, वह लौटा दिया जाता है। आपके पास else ब्लॉक इस्तेमाल करने का विकल्प है, जिससे असफल मैचों को पकड़कर रिटर्न वैल्यू बदली जा सके।
आपका पासपोर्ट जल्द ही एक्सपायर होने वाला है, इसलिए उसे फिर से बनवाने के लिए आपको नगर कार्यालय जाना पड़ेगा। अपने पहले के अनुभव से आप जानते हैं कि आपके नगर कार्यालय से काम निकलवाना जरूरी नहीं कि सबसे आसान हो, इसलिए आप ठान लेते हैं कि जहाँ तक हो सके, हमेशा "सफल रास्ते" पर ही ध्यान देते रहेंगे।
आप अपना नया पासपोर्ट पाने के लिए जरूरी फॉर्म प्रिंट करते हैं, उसे भरते हैं, अपनी कार में बैठते हैं, ब्लॉक का एक चक्कर लगाते हैं, कार पार्क करते हैं और कार्यालय की ओर निकल पड़ते हैं।
आगे दिए गए सभी कामों के लिए आपको get_new_passport/3 को लागू करना होगा और उसे आगे बढ़ाना होगा।
पता चलता है कि यह इमारत सिर्फ दोपहर में ही खुलती है, और हर दिन एक ही समय पर नहीं।
enter_building/1 फंक्शन को मौजूदा समय के साथ कॉल कीजिए (यह समय आपको get_new_passport/3 के पहले आर्गुमेंट के रूप में मिलता है)। अगर इमारत खुली है, तो यह फंक्शन :ok और एक टाइमस्टैम्प वाला टपल लौटाएगा, जिसकी आपको बाद में जरूरत पड़ेगी। वरना यह :error और एक संदेश वाला टपल लौटाएगा। फिलहाल, सफल रास्ता :ok वाला टपल लौटा सकता है।
अगर आपको :error वाला टपल मिले, तो उसे लौटाने के लिए else ब्लॉक का इस्तेमाल कीजिए।
सूचना डेस्क लंबे कॉफी ब्रेक लेने के लिए बदनाम है। अगर आप किस्मत से वहाँ किसी से मिल पाएँ, तो वह आपको एक निर्देश पुस्तिका देगा, जिसमें बताया होगा कि आपकी जन्मतिथि के हिसाब से आपको किस काउंटर पर जाना है।
find_counter_information/1 फंक्शन को मौजूदा समय के साथ कॉल कीजिए। आपको या तो :ok और एक पुस्तिका वाला टपल मिलेगा, जिसे एक अनाम फंक्शन से दर्शाया गया होगा, या :coffee_break और कुछ और निर्देशों वाला टपल मिलेगा। अपने सफल रास्ते में, जहाँ आपको पुस्तिका मिलती है, उसे अपनी जन्मतिथि पर लागू कीजिए (जो get_new_passport/3 का दूसरा आर्गुमेंट है)। यह उस काउंटर की संख्या लौटाएगा जहाँ आपको जाना है। उस काउंटर संख्या के साथ एक :ok टपल लौटाइए।
अगर आपको :coffee_break संदेश मिले, तो :retry और एक NaiveDateTime वाला टपल लौटाइए, जो मौजूदा समय से 15 मिनट बाद का समय बताता हो। जैसा पहले था, अगर आपको :error वाला टपल मिले, तो उसे लौटा दीजिए।
पता नहीं क्यों, अलग-अलग काउंटरों पर अलग-अलग रंग के फॉर्म चाहिए होते हैं। बेशक, आपने वही फॉर्म प्रिंट किया था जो वेबसाइट पर सबसे पहले मिला था, इसलिए आप अपने सफल रास्ते पर ध्यान देते हैं और उम्मीद करते हैं कि सब ठीक होगा।
stamp_form/3 फंक्शन को वह टाइमस्टैम्प, जो आपको प्रवेश द्वार पर मिला था, वह काउंटर और वह फॉर्म, जो आप लाए थे, देकर कॉल कीजिए (get_new_passport/3 का अंतिम आर्गुमेंट)। आपको या तो :ok और एक चेकसम वाला टपल मिलेगा, जिसका इस्तेमाल आपके पासपोर्ट नंबर की जाँच के लिए किया जाएगा, या :error और एक संदेश वाला टपल मिलेगा। अपने सफल रास्ते में उस चेकसम के साथ एक :ok टपल लौटाइए। अगर आपको :error वाला टपल मिले, तो उसे लौटा दीजिए।
अंत में, आपके पास वे सभी दस्तावेज हैं जिनकी आपको जरूरत है।
get_new_passport_number/3 को वह टाइमस्टैम्प, वह काउंटर और पहले मिला वह चेकसम देकर कॉल कीजिए। आपको अपने अंतिम पासपोर्ट नंबर वाली एक स्ट्रिंग मिलेगी। अब बस इतना बाकी है कि उस स्ट्रिंग को :ok वाले टपल में लौटाइए और घर चले जाइए।
Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।