Odatiy dalil - Default argument

Yilda kompyuter dasturlash, a standart argument bu dalil a funktsiya Ko'pgina dasturlash tillarida funktsiyalar bir yoki bir nechta argumentlarni qabul qilishi mumkin. Odatda, har bir dalil to'liq ko'rsatilishi kerak (bu holat C dasturlash tili[1]). Keyinchalik tillar (masalan, C ++ ) dasturchiga funktsiyani chaqirishda ko'rsatilmagan bo'lsa ham, har doim qiymatga ega bo'lgan standart argumentlarni ko'rsatishga ruxsat berish.

C ++ da standart argumentlar

Quyidagi funktsiya deklaratsiyasini ko'rib chiqing:

int MyFunc(int a, int b, int v = 12);

Ushbu funktsiya uchta argumentni oladi, ulardan oxirgisi sukut bo'yicha o'n ikkitaga ega. Dasturchi ushbu funktsiyani ikki usul bilan chaqirishi mumkin:

int natija = MyFunc(1, 2, 3);natija = MyFunc(1, 2);

Birinchi holda argument uchun qiymat chaqirildi v normal deb ko'rsatilgan. Ikkinchi holda, argument qoldiriladi va standart qiymati 12 o'rniga ishlatiladi.

Qo'ng'iroq qiluvchi tomonidan argument ko'rsatilganligini yoki standart qiymat ishlatilganligini bilish uchun hech qanday vosita yo'q.

Yuqorida aytib o'tilgan usul, funktsiyani parametrlar bilan yoki ularsiz chaqirish uchun standart mezonlarni belgilashni xohlaganda ayniqsa foydalidir.

bekor PrintGreeting(std::ostream& oqim = std::cout) {  // Bu berilgan oqimga xabar chiqaradi.  oqim << "Salom Dunyo!";}

Funktsiya chaqiruvi:

PrintGreeting();

sukut bo'yicha bosib chiqaradi "Salom Dunyo!" uchun standart chiqish std :: cout (odatda ekran). Boshqa tomondan, har qanday turdagi ob'ekt std :: ostream endi bir xil funktsiyaga o'tish mumkin va funktsiya standart chiqim o'rniga o'rniga berilgan oqimga bosib chiqadi.

PrintGreeting(std::kerr);

Standart argumentlarning qiymatlari chaqirilayotgan funktsiya tanasida emas, balki qo'ng'iroq saytida "to'ldirilganligi" sababli, virtual funktsiyalar ularning standart argument qiymatlarini virtual funktsiya tanasini ta'minlovchi ob'ektning dinamik turidan emas, balki ko'rsatgichning statik turidan yoki qo'ng'iroq amalga oshiriladigan ma'lumotdan oling.

tuzilmaviy Asosiy {  virtual std::juftlik<int, int> Foo(int x = 1) {    qaytish {x, 1};  }};tuzilmaviy Olingan : jamoat Asosiy {  std::juftlik<int, int> Foo(int x = 2) bekor qilish {    qaytish {x, 2};  }};int asosiy() {  Olingan d;  Asosiy& b = d;  tasdiqlash(d.Foo() == std::make_pair(2, 2));  tasdiqlash(b.Foo() == std::make_pair(1, 2));}

Haddan tashqari yuklangan usullar

Kabi ba'zi tillar Java, standart dalillarga ega emassiz. Biroq, xuddi shu xatti-harakatlar yordamida taqlid qilish mumkin ortiqcha yuklash usuli turli xil sonli argumentlarni qabul qiladigan bir xil nomdagi ortiqcha yuklangan usullarni yaratish; va kamroq argumentli versiyalar oddiy argumentlarni etishmayotgan argumentlar bilan ko'proq argumentli versiyalarni chaqiradi:

int MyFunc(int a, int b) { qaytish MyFunc(a, b, 12); }int MyFunc(int a, int b, int v) { / * asosiy dastur bu erda * / }

Biroq, qo'shimcha ravishda bir nechta boshqa kamchiliklar, standart argumentlar tip tizimida modellashtirilmaganligi sababli, qayta qo'ng'iroq turi (aka yuqori darajadagi funktsiya) ortiqcha yuklarning ikkalasini ham qabul qilishini yoki haddan tashqari yuklangan funktsiyalar bilan standart argumentlarni simulyatsiya qila olmaydi. Holbuki, JavaScript-da haddan tashqari yuklanmagan funktsiya ta'rifi kirish qiymati bo'lganda sukut o'rnini bosishi mumkin aniqlanmagan (agar u aniq bo'lmagan bo'lsa, qat'iy nazar aniqlanmagan argumentning qo'ng'iroq qilinadigan joyda yo'qligi yoki aniq o'tib yuborilishi orqali aniqlanmagan qiymati); ixtiyoriy argument parametr turi sifatida modellashtirilgan ?: TypeScript-da. JavaScript-ning echimi statik ravishda hal qilinmagan (ya'ni kompilyatsiya vaqtida emas, shuning uchun TypeScript funktsiya tipidagi imzodagi standart qiymatlarni emas, balki faqat ixtiyoriylikni modellashtiradi), shuning uchun qo'shimcha ish vaqti qo'shimcha xarajatlarni keltirib chiqaradi, garchi bu qayta qo'ng'iroqlar o'zlarining asl holatlarini markaziy o'rniga mustaqil ravishda boshqarishi mumkin bo'lsa qayta qo'ng'iroqni kiritadigan funktsiya turi (qayta qo'ng'iroq turi imzoi) tomonidan belgilanadi. TypeScript echimi bo'lishi mumkin Java-da simulyatsiya qilingan bilan Ixtiyoriy yopiq analogdan tashqari turi aniqlanmagan har bir mavjud bo'lmagan argument aniq Ixtiyoriy. yo'q () qo'ng'iroq saytida.

Baholash

Har bir funktsiya chaqiruvi uchun standart argument qiymatlari chaqirilgan funktsiyaga o'tkazilishi kerak.

Agar standart argument qiymati yon ta'sirlarni o'z ichiga olsa, ushbu yon ta'sirlarni baholashda muhim ahamiyatga ega - butun dastur uchun bir marta (tahlil vaqtida, kompilyatsiya vaqtida yoki yuklash vaqtida) yoki har bir qo'ng'iroq uchun bir marta, qo'ng'iroq paytida.

Python funktsiya deklaratsiyasini baholash paytida standart argumentlardagi ifodalarni bir marta baholaydigan diqqatga sazovor til. Agar funktsiya chaqiruvi bo'yicha baholash zarur bo'lsa, uni odatiy argumenti a bo'lishi bilan takrorlash mumkin qo'riqchi qiymati, kabi Yo'q, so'ngra funktsiya tanasiga ega bo'lish, faqat qo'riqchi qiymati qabul qilingan taqdirda standart qiymatning yon ta'sirini baholaydi.

Masalan:

Import tasodifiydef g'ayratli(a=tasodifiy.tasodifiy()):    qaytish ax = g'ayratli()y = g'ayratli()tasdiqlash x == ydef dangasa(a=Yo'q):    agar a bu Yo'q:        a = tasodifiy.tasodifiy()    qaytish ax = dangasa()y = dangasa()tasdiqlash x != y

Hajmi

Odatda sukut bo'yicha argument parametr tomonidan berilgan argumentga yoki funktsiya boshlanishida e'lon qilingan mahalliy o'zgaruvchiga o'xshab ketadi va bir xil bo'ladi qamrov doirasi va parametr (boshqa umr o'zgaruvchisi), ya'ni an avtomatik o'zgaruvchan funktsiyani tugatishda taqsimlanadi.

Boshqa hollarda, standart argument o'rniga statik ravishda ajratilishi mumkin. Agar o'zgaruvchi o'zgarishi mumkin bo'lsa, u o'z funktsiyasini chaqiruvlar bo'ylab, masalan, a kabi saqlaydi statik o'zgaruvchi.

Ushbu xatti-harakatlar Python-da o'zgaruvchan turlar, masalan, ro'yxatlar uchun mavjud. Baholashda bo'lgani kabi, mahalliy o'zgaruvchini bir xil darajada ta'minlash uchun, qo'riqchi qiymatidan foydalanish mumkin:

def g'ayratli(a=[]):    qaytish ax = g'ayratli()x += [1]tasdiqlash g'ayratli() == [1]def dangasa(a=Yo'q):    agar a bu Yo'q:        a = []    qaytish ax = dangasa()x += [1]tasdiqlash dangasa() == []

Adabiyotlar

  1. ^ Lesli, Martin. "Standart parametrlar". C ++ dasturlash bo'yicha ma'lumot. Arxivlandi asl nusxasi 2011 yil 9 oktyabrda. Olingan 13 yanvar 2012.