مثل اکثر زبان های برنامه نویسی از آرایه ها برای نگه داری چندین مقدار استفاده می کنیم. در سالیدیتی ۲ نوع آرایه وجود دارد. آرایه fixed و آرایه dynamic.
ارایه های fixed طول ثابتی دارند و قابل افزایش نیستند. آرایه های dynamic طول ثابتی ندارند و می توان طول آن ها را افزایش داد و مقادیر بیشتری به آن ها اضافه کرد.
در هنگام تعریف یک آرایه باید data type عناصر آن مشخص باشد. به مثال های زیر دقت کنید:
شما می توانید یک آرایه از نوع struct هم تعریف کنید . در قسمت اول آموزش یک struct از نوع Person تعریف کردیم. به مثال زیر دقت کنید . یک آرایه از نوع Person و به صورت داینامیک تعریف شده.
به خاطر دارید که در قسمت قبلی گفتم state variable ها برای همیشه در بلاکچین اتریوم ذخیره می شوند؟ با تعریف آرایه های داینامیک می توانیم یک سری اطلاعات را داخل storage نگه داری کنیم. مثل یک دیتابیس. به آن عنصر اضافه کنیم. اجزای ارایه را تغییر بدهیم. به آن عنصر اضافه کنیم. یا از آن عنصر حذف کنیم. دقیقا مثل یک پایگاه داده.
در هنگام تعریف یک آرایه می توانیم آن را public تعریف کنیم. در واقع یک آرایه public از بیرون contract خودش قابل خواندن است. ولی قابل نوشتن نیست. آرایه های public می توانند برای نگه داری اطلاعات public داخل contract ها مورد استفاده قرار بگیرند.
مانند اکثر زبان های برنامه نویسی از فانکشن ها برای دسته بندی کد هایی که رفتار به خصوصی دارند استفاده می کنیم. به فانکشن زیر دقت کنید.
یک فاکشن با اسم eatHotDogs تعریف شده است که ۲ پارامتر (ورودی های تابع) می گیرد. یکی از نوع uint و کی از نوع string. بدنه ی این فانکشن فعلا خالی هست. توجه کنید که فانکشن به صورت public تعریف شده است. اگر دقت کنید متوجه می شوید که مشخص کردیم متغیر name کجا ذخیره شود . در داخل مموری (memory) ! . برای دیتا تایپ های از نوع reference type یعنی arrays - struct ها و mapping ها و string ها حتما باید مشخص کنیم کجا ذخیره بشوند.
حالا reference type چی هست ؟
در سالیدیتی به ۲ روش می توان اطلاعات را به فانکش ها پاس داد. یکی By value و دیگری By reference.
پاس دادن به صورت By value به این معنی است که کامپایلر سالیدیتی یک کپی جدید از مقدار پارامتر ایجاد کرده و آن را به فانکشن شما منتقل می کند. این به فانکشن شما اجازه می دهد تا مقدار را بدون نگرانی از تغییر مقدار پارامتر اولیه تغییر دهید. یعنی اگر مقدار پارامتر را داخل فانکشن تغییر دهید مقدار پارامتری که از بیرون فانکشن پاس دادید تغییر نمی کند.
پاس دادن به صورت By reference هم یعنی که فانکشن شما با اشاره به متغیر اصلی فراخوانی می شود. بنابراین، اگر فانکشن شما مقدار متغیری را که دریافت می کند تغییر دهد، مقدار متغیر اصلی که از بیرون فانکشن پاس دادید تغییر می کند.
اگر بخواهیم یک متغیر را به روش By value به فانکشن پاس بدهیم باید از کلید واژه memory در تعریف پارامتر فانکشن استفاده کنیم. در فانکشن بالا متغیر name به صورت memory تعریف شده است. یعنی مقدار متغیری که به این پارامتر پاس داده می شود فقط درون فانکشن تغییر می کند.
توجه: یک قرارداد و توافق بین تمام توسعه دهندگان سالیدیتی وجود دارد که اول اسم پارامتر های فانکشن ها باید با _ شروع بشود . من از این قرارداد در تمام قسمت های این سری آموزش استفاده می کنم.
برای فراخوانی کردن یک فانکشن به صورت زیر عمل می کنیم.
به contract زیر دقت کنید . یک struct تعریف شده با نام Person. هر Person باید یک name و یک age داشته باشد. همچنین یک آرایه که می تواند تعدادی Person را نگه داری کند به اسم people تعریف شده است.
به فانکشن درون contract دقت کنید . بدنه این فانکشن یک Person جدید ایجاد می کند و آن را به آرایه people اضافه می کند.
توجه کنید که push عنصر جدید را همیشه به انتهای آرایه اضافه می کند.
امیدوارم لذت برده باشید. در قسمت بعدی موارد بیشتری را آموزش می دهیم. اگر قسمت قبل را مطالعه نکرده اید از لینک زیر استفاده کنید و حتما مطالعه کنید.
اگر دوست داشتید من را در لینکدین دنبال کنید.