💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ محمد حیدری
سوال در مورد تابع NewPerson
Reza Mobaraki حل شده توسط Reza Mobaraki

سلام، سه تا سوال داشتم:

  • تابع NewPerson در واقع یه Constructor هستش درسته؟
  • و اینکه چون تایپ PersonOptions ذاتا یک فانکشن هست تونستیم به عنوان یک variadic function برای آرگومان تابع NewPersonمون ازش استفاده کنیم؟
  • و مورد آخر هم اینکه من متوجه نشدم که چرا تابع NewPerson باید یه چیزی از جنس پوینتر به استراکت Person رو return بکنه.

درود وقتتون بخیر


  • بله، تابع `NewPerson` در واقع یک سازنده (constructor) هستش. این تابع برای ساخت یک نمونه از ساختار(struct) `Person` با پارامترهای مختلف استفاده میشه.
  • تایپ `PersonOptions` در واقع یک تابع هستش که یک پارامتر از نوع `*Person` رو میگره و تغییرات مربوط به این ساختار رو انجام میده. از اونجایی که تابع `PersonOptions` به عنوان یک ورودی ( آرگومان) متغیر به تابع `NewPerson` در نظر گرفته شده و میتونه به صورت variadic تعداد دلخواهی از اون رو بگیره.

استفاده از `...` توی تعریف پارامتر تابع `NewPerson` جهت استفاده از تعداد مد نظر آرگومان از نوع `PersonOptions` است. توی این روش میتونید تعدادی تابع `PersonOptions` رو به عنوان آرگومان‌های تابع `NewPerson` ارسال کنید و در هر تابع `PersonOptions`، تغییرات مربوط به ساختار `Person` را انجام بدید.

مثلا میتونید اینطوری از تابع `NewPerson` استفاده کنید:

person := NewPerson(SetName("Maryam"), SetFamily("Rezaei"), SetAge(23), SetGender("Female"),SetHeight(175), SetWeight(70), SetHairColor("Black"))

توی این مثال تعدادی تابع `PersonOptions` رو به عنوان آرگومان‌های `NewPerson` ارسال میکنیم. این تابع‌ها، تغییرات مربوط به ساختار `Person` رو اعمال میکنه و تمام این تغییرات در نمونه `person` اعمال میشه. ( رجوع کنید به این جلسه‌ )


  • ( در واقع بهتر اینجا رجوع کنید به این جلسه نوع ساختار‌های داده refrence type و value type )‌ تابع `NewPerson` برای return کردن یک مقدار از نوع اشاره‌گر به ساختار `Person` استفاده میکنه (یعنی `*Person`). این کار به خاطر این هستش که توی تابع `NewPerson`، یک ساختار `Person` جدید ایجاد میشه و تغییراتی روی آن اعمال میشه. با استفاده از pointer، میتونیم به طور مستقیم تغییرات رو توی ساختار `Person` اصلی انجام بدیم.

توی این حالت، اگ از `*Person` به جای `Person` استفاده نکنیم، هر تغییری که در تابع `NewPerson` روی ساختار `person` اعمال میشد، روی نسخه ایجاد شده محدود میشد و تغییرات روی ساختار `Person` اصلی برنمیگشت. با استفاده از اشاره‌گر، میتونید تغییرات رو به ساختار اصلی انتقال بدید.


موفق باشید ?


بهترین پاسخ
Reza Mobaraki ۲۶ خرداد ۱۴۰۲، ۰۹:۱۴

سلام مجدد، ممنون که وقت گذاشتید و پاسخ دادید

دو مورد اول رو متوجه شدم ولی توی مورد سوم هنوز یه ابهامی دارم.

شما توی جوابتون گفتید:

توی این حالت، اگ از `*Person` به جای `Person` استفاده نکنیم، هر تغییری که در تابع `NewPerson` روی ساختار `person` اعمال میشد، روی نسخه ایجاد شده محدود میشد و تغییرات روی ساختار `Person` اصلی برنمیگشت. 

سوالم اینجاست که اصلا چه نیازی هست که تغییرات روی ساختار 'Person' اصلی برگرده؟

چون فقط یکبار تایع NewPerson رو کال کردیم و اصطلاحا Singleton هست تایپ برگشتی از تابع NewPerson رو به جای 'Person' از جنس اشاره گری بهش ('Person*') انتخاب کردیم یا دلیل دیگه ای داره؟

محمد حیدری ۲۸ خرداد ۱۴۰۲، ۱۵:۳۹

نکته اول اینکه خب ما اینجا نیاز به یک نمونه جدید داریم دیگه .

اگر پرسپکتیو بالاتری نسبت به پیاده سازی داشته باشیم مصلما ما نمیخوایم singletone باشه در نتیجه تمام تغیرات باید اعمال بشه .

نکته : pointer یک ساختار داده رفرنس تایپ هست

Reza Mobaraki ۳۰ خرداد ۱۴۰۲، ۱۵:۱۶