টা

টাইপস্পেক মধ্যে Elixir

১টি অনুশীলনী

টাইপস্পেক সম্পর্কে

এলিক্সির একটি ডাইনামিকভাবে টাইপড ভাষা, অর্থাৎ এটি কম্পাইল-টাইম টাইপ চেক দেয় না। তবুও টাইপ স্পেসিফিকেশন কাজে লাগতে পারে, কারণ এগুলো:

  • ডকুমেন্টেশন হিসেবে কাজ করে।
  • Dialyzer-এর মতো স্ট্যাটিক অ্যানালাইসিস টুল সম্ভাব্য bug খুঁজে বের করতে এগুলো ব্যবহার করতে পারে।

ফাংশন ডিফিনিশনের ঠিক আগে @spec মডিউল অ্যাট্রিবিউট ব্যবহার করে একটি ফাংশনে টাইপ স্পেসিফিকেশন যোগ করা যায়।

@spec longer_than?(String.t(), non_neg_integer()) :: boolean()
def longer_than?(string, length), do: String.length(string) > length

টাইপ

টাইপস্পেকে যেসব এক্সপ্রেশন ব্যবহার করা যায়:

  • মৌলিক টাইপ, যেমন:

    • boolean()
    • integer(), non_neg_integer(), pos_integer(), float()
    • list()
    • map()
    • any()
  • একাধিক টাইপের ইউনিয়ন:

    • যেমন integer() | list(integer())
  • প্যারামিটারাইজড টাইপ:

    • যেমন list(integer()) - ইন্টিজারের একটি অ্যারে
    • যেমন %{age: integer()} - :age কী (key)-এর নিচে একটি ইন্টিজার মান সহ ম্যাপ
  • রিমোট টাইপ (কোনো মডিউলে ডিফাইন করা), যেমন:

  • লিটারাল, যেমন:

    • %{} - একটি খালি ম্যাপ
    • [] - একটি খালি অ্যারে (তবে [any()] একটি অ-খালি অ্যারে)
    • যেমন :ok - একটি অ্যাটম লিটারাল
  • বিল্ট-ইন বিশেষায়িত টাইপ, যেমন:

    • char() - 0..0x10FFFF রেঞ্জের একটি ইন্টিজার
    • charlist() - ক্যারেক্টারের একটি অ্যারে
    • keyword() - দুই এলিমেন্টের টাপলের একটি অ্যারে, যেখানে প্রথম এলিমেন্টটি একটি অ্যাটম
  • কাস্টম টাইপ

সব টাইপের সম্পূর্ণ তালিকা অফিশিয়াল ডকুমেন্টেশনের "Typespecs" অংশে পাওয়া যাবে।

আর্গুমেন্টের নাম দেওয়া

টাইপস্পেকে আর্গুমেন্টের নামও দেওয়া যায়, যা একই টাইপের একাধিক আর্গুমেন্ট আলাদা করতে কাজে লাগে।

@spec to_hex({hue :: integer, saturation :: integer, lightness :: integer}) :: String.t()

কাস্টম টাইপ

তিনটি মডিউল অ্যাট্রিবিউটের যেকোনো একটি ব্যবহার করে কাস্টম টাইপ ডিফাইন করা যায়:

  • @type - একটি পাবলিক টাইপ ডিফাইন করে
  • @typep - একটি প্রাইভেট টাইপ ডিফাইন করে
  • @opaque - একটি পাবলিক টাইপ ডিফাইন করে যার গঠন প্রাইভেট
@type color :: {hue :: integer, saturation :: integer, lightness :: integer}

@spec to_hex(color()) :: String.t()

String.t() বনাম binary() বনাম string()

String.t() হলো এলিক্সির স্ট্রিংয়ের জন্য ব্যবহার করার সঠিক টাইপ, যেগুলো UTF-8 এনকোড করা বাইনারি। কারিগরি দিক থেকে String.t() আসলে একটি binary() হিসেবে ডিফাইন করা, আর অ্যানালাইসিস টুলের কাছে এই দুটি টাইপ সমতুল্য। তবে এলিক্সির স্ট্রিং নিয়ে কাজ করে এমন ফাংশন ডকুমেন্ট করার সময় String.t() উদ্দেশ্য বেশি স্পষ্ট করে।

অন্যদিকে string() একটি ভিন্ন টাইপ। এটি একটি Erlang স্ট্রিং, যা এলিক্সিরে charlist নামে পরিচিত। টাইপস্পেকে string() টাইপ এড়িয়ে চলা উচিত, বদলে charlist() ব্যবহার করা উচিত।

Dialyzer

Dialyzer হলো একটি স্ট্যাটিক অ্যানালাইসিস টুল, যা Erlang ও Elixir কোডে টাইপ এররের মতো সমস্যা ধরতে পারে। একটি Elixir প্রজেক্টে Dialyzer ব্যবহারের সবচেয়ে সহজ উপায় হলো Dialyxir।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

টাইপস্পেক শিখুন