شروع elixir : آشنایی با Tuples و Lists و Maps

درود خدمت دوستان گرامی بلخره وقت شد این زبان زیبا و همینطور کاربردی را برای ساخت ابزاری هایی که نیاز دارم شروع کنم .
یکی از راه ها ویدیو بوده و یکی دیگه هم خوندن کتاب . که دوستان زحمت کشیدن در پست های دیگه کتاب های خوبی معرفی کردند . یکی از این کتاب ها programming elixir 1.3 بود که بسیار کارامد هست . منم بعد از دیدن ویدیو ها سعی کردم این کتاب را به صورت مفهمومی هرچی که فهمیدم یک جا یاداشت کنم . خوب خیلی ها مثل من تازه وارد هستند و دوست دارند یک آشنایی با این زبان پیدا کنند . به همین منظور هر بخشی رو که درک کردم می خوام کم کم در اینجا قرار بدم امید وارم دوستان حرفه ای و با تجربه مشکلات بنده را گوشزد کنند.

اولین چپتری که من شروع کردم آشنایی با Tuples و list و Maps می باشد

#آموزش الکسیر :grinning:

##کار با Tuples

کار با Tuples ها تقریبا مثل کار با یک آرایه و همزمان با یک ثابت هست . Tuple ها به عنوان یک پنتر ماچین کار می کند مورد زیر را ببنید :

{status, file} = File.open("access.xml")

در مثال بالا با یک Tuple درست کردیم که یک استاتوس دارد و یک متغیر دیگر به نام file اگر فایل به درستی اجرا شود و مشکل نداشته باشید یعنی دستور

File.open("access.xml")

را به تنهایی اجرار کنید . به شما پیغام زیر را بر می گرداند

{:ok, #PID<0.131.0>}

حال اگر شما بیایید و status را بزنید برای شما :ok و اگر فایل را بزنید مورد دوم که با رنگ زرد هست را بر می گرداند . شما به راحتی توانستید یک پترن ماچین درست کنید .

{status , count , action } = {:ok , 42 , "new"}

در بالا یک مثال دیگر از Tuple زدیم که حالا شما می توانید با فراخوانی count عدد 42 را بر می گرداند

##کار با List
لیست ها همان آرایه ها می باشند . باید به این نکته اشاره کرد که در list ها می توان از Tuple استفاده کرد . این کار می توانید برای مصرف های زیاد دسته بندی شود که در ادامه بیشتر مثال خواهیم زد

یک لیست :

[1, 2, 3, 4, "gg"]

اگر می خواهید به یک list یک لیست دیگر اضافه کنید یا کم کنید به شرح زیر عمل کنید

[1,2,3,4,"gg"] ++ [“hi",2,3,4]

اگر بخواهید از داخلش کم کنید به شرح زیر

[1,2,3,4] -- [2,3]

اگر می خواهید در یک آرایه چیزی را سرچ کنید و جواب آن بولین داده شود که آیا وجود دارد یا خیر به شرح زیر :

"shahryar" in [1,2,3,4] 

جواب بالا false می باشد

یک نمونه از list به صورت زیر می باشد :

[name: "shahryar", city: "amol"]

دسترسی به این آرایه :

arr = [name: "shahryar", city: "amol"]

برای دسترسی به یکی از عناصر بالا

arr[:name]

حالا اگر بخواهیم همین list را با Tuple بنویسیم به صورت زیر می باشد

arrTuples = [{:name, "shahryar"}, {:city, "amol"}]

خروجی می شود :

[name: "shahryar", city: "amol"]

مثل مثال بالا می توانید به تک تک عناصرش دسترسی داشته باشید

##کار با Maps

اگر بخواهیم Maps را در چند کلمه توضیح بدهیم . می توانیم بگوییم Map کالکشنی از کلید و مقدار و یا هر جفت می باشد ( key/value )

مثال

states = %{"ALL" => "list of shadow", "IO" => 22}

به مثال زیر توجه کنید . دقیقا می توانید قدرت Map را درک کنید :

respons = %{ {:error , :enoent } => :fatal , { :error , :busy } => :retry }

برگشت کد بالا در ترمینال :

%{{:error, :busy} => :retry, {:error, :enoent} => :fatal}

یک مثال دیگر :

colors = %{ :red => 0xff0000, :green => 0x00ff00, :blue => 0x0000ff }

خوب در بالا خیلی از موارد را به صورت یک مثال برای شما شرح دادیم و شما به راحتی درک کردید که Maps چقدر می تواند در کد ها به شما کمک کند حال فکر می کنم برای شما سوال شده است که چطور می تواند به آن دسترسی داشت

به عنوان مثال کد زیر را ببنید :

states = %{"ALL" => "list of shadow", "IO" => 22}

برای دسترسی به کد بالا شما می توانید states[“ALL”] را تایپ کنید و به راحتی list of shadow را چاپ نمایید.

کدی که در بالا زدیم را به یاد دارید ؟

respons = %{ {:error , :enoent } => :fatal , { :error , :busy } => :retry }

به نظر من این خط می تواند در ۸۰ درصد برنامه من اجرا شود . چون می تواند در هر بخش از کد هایم ارور ها را دسته بندی کند ولی چطور می تواند به آن دسترسی داشت ؟ خیلی ساده

respons[{:error, :busy}]

و در آخر کد زیر را به خاطر بیاورید !! برای آن دو راه وجود دارد

colors = %{ :red => 0xff0000, :green => 0x00ff00, :blue => 0x0000ff }

حال شما می توانید به واسطه کد

 colors[:red] 

یا می توانید colors.red آن را فراخوانی و چاپ نمایید. برای من که واقعا زیبا و جذاب بود

دوستان عزیزم pdf این معرفی هم از زیر دانلود کنید

#اصلاحات :

وقتی ما یک لیستی از تاپل ها داشته باشیم و اولین کلید اون یک اتم باشه اون دیگه لیست نیست KeywordList هست و هر عملی که بر روی لیست قابل انجام هست روی کیوورد لیست هم قابل انجامه :

In Elixir, when we have a list of tuples and the first item of the tuple (i.e. the key) is an
atom, we call it a keyword list:

اینم مثالش :

iex> list = [{:a, 1}, {:b, 2}]
[a: 1, b: 2]
iex> list == [a: 1, b: 2]
true
iex> list[:a]
1

#منابع

ویدیو های پیشنهادی :

کتاب های پیشنهادی :

4 پسندیده

خيلى خوب بود، فقط بعضى جاها به جاى Maps و Tuples از شكل مفرد استفاده كنيد. Map , Tuple

2 پسندیده

تشکر از شما . اگر یک مثال می زدید در متن تا من درک بکنم ممنون شما می شدم . چون چیزی بود که کتاب نوشته بود سعی کردم بخاطر اینکه آماتور هستم ازش تبعیت کنم:rose:

2 پسندیده

مثلا Tuples ها، بايد بشه Tuple ها چون Tuples جمع Tuple هست. اينو به اين دليل ميگم كه مشخص بشه اسم ديتا تايپ ها در اصل Tuple, Map, List و غيرست

2 پسندیده

خیلی خیلی خیلی عالی و موفق باشی
فقط چندجا اشتباه کردی و اونا رو درست کن
وقتی ما یک لیستی از تاپل ها داشته باشیم و اولین کلید اون یک اتم باشه اون دیگه لیست نیست KeywordList هست و هر عملی که بر روی لیست قابل انجام هست روی کیوورد لیست هم قابل انجامه :
In Elixir, when we have a list of tuples and the first item of the tuple (i.e. the key) is an
atom, we call it a keyword list:
اینم مثالش :
iex> list = [{:a, 1}, {:b, 2}]
[a: 1, b: 2]
iex> list == [a: 1, b: 2]
true
iex> list[:a]
1

داداش کتابای بالا رو منم مثل تو رفتم اما جالب نیستن منبع بهتر پیدا کردم

1 پسندیده

توماج جان من یواش یواش بیشتر دارم در مورد خود ارلنگ کنجکاو میشم و خدا آخر عاقبت این کنجکاوی رو به خیر کنه.از وقتی فهمیدم سرویس چت فیس بوک و خیل عظیمی از سیستم های کله گنده به قدرت ارلنگ دارن مانور میدن یجورایی احساس میکنم داره صدام میکنه

whatsapp هم با Erlang نوشته شده

1 پسندیده

در مورد keyword list تقریبا درست میگی, اما keyword list هم list هست.
کتابای بالا بهترین کتاب های Elixir هستد, بخصوص Programming Elixir 1.3

1 پسندیده

روش یادگیری و … کلا سلیقه ای هست ممکنه شما با گفتار و نحوه بیان و اموزش یک نویسنده سازگاری داشته باشین اما کس دیگه ای خوشش نیاد ، بله قبول دارم کتابای خوبی ان اما من خودم خوشم نیومد و گزینه های بهتری برای خودم پیداکردم

بله و خیلی سیستم های دیگه Hangout Chef و… کم نیستن

شما گفتین جالب نیستن, منم نظرمو گفتم

1 پسندیده

میشه بپرسم براای کیورد لیست چرا گفتین تقریبا ؟ چون خود داکیومنت الکسیر :
In Elixir, we have two main associative data structures: keyword lists and maps. It’s time to learn more about them
!
Keyword lists are important because they have three special characteristics:
• Keys must be atoms.
• Keys are ordered, as specified by the developer.
• Keys can be given more than once.

کیورد لیست در کل یک لیست هست و در این شکی نیست اما تو دسته بندی داخل associative data structures قرار میگیره

بله برای من جالب نبود چون تو فانکشنال تازه کارم و کلی از مفاهیم رو نمیدونم

راستی توماج جان میشه برای فانکشنال بهم یه منبع خوب بگی که خیلی خیلی ساده مفاهیمشو بتونم درک کنم ، چون حتی اگر الکسیر رو قورت بدم اما ندونم فانکشنال چیه و کجا استفاده میشه و به چه دردی میخوره عملاً کار من بی فایدس بنظرم

با هسكل شروع كن،
كتاب learn you a haskell به صورت online رايگان هست

1 پسندیده

Clojure هم خيلى عاليه و كتاب clojure for the brave and true هم به صورت آنلاين رايگانه

1 پسندیده

همون كتاب programming elixir شما رو تبديل به برنامه نويس فانكشنال ميكنه

1 پسندیده

اين كجاش كفته keyword list ديگه list نيست؟

1 پسندیده

clojure کار من نیست و برام خیلی خیلی عجیب و پیچیدس . شما بهتره منو با خودتون قیاس نکنید چون تو فانکشنال صاحب نظرین و سوییچ کردن براتون اسونه من صرفا میخوام مفاهیمشو یاد بگیرم و با الکسیر برم جلو بعدا که واردتر شدم haskell یا clojure برام مناسبتره

من با clojure شروع كردم، مقايسه هم نكردم، در فانكشنال هم صاحب نظر نيستم.
بهتره از به كاربردن حدث هاى رندم به صورت جملاتى كه انگار صد درصد درست ميگيم پرهيز كنيم، نه فقط به اين خاطر كه موادبانه تر هست، بلكه بيشتر به اين دليل كه ديگران و خودمون رو به اشتباه ميندازه

1 پسندیده