O'zgaruvchan soyalar - Variable shadowing

Yilda kompyuter dasturlash, o'zgaruvchan soya ma'lum bir ichida e'lon qilingan o'zgaruvchida paydo bo'ladi qamrov doirasi (qarorlar bloki, usuli yoki ichki klassi) tashqi doirada e'lon qilingan o'zgaruvchiga o'xshash nomga ega. Identifikatorlar darajasida (o'zgaruvchilar o'rniga nomlar), bu quyidagicha tanilgan ismlarni maskalash. Ushbu tashqi o'zgaruvchiga ichki o'zgaruvchi soya soladi, ichki identifikatorga aytiladi niqob tashqi identifikator. Bu chalkashlikka olib kelishi mumkin, chunki soyali o'zgaruvchi nomining keyingi o'zgarishi qaysi o'zgaruvchiga tegishli ekanligi noma'lum bo'lishi mumkin. ism o'lchamlari til qoidalari.

O'zgaruvchan soyani joriy qilgan birinchi tillardan biri bu edi ALGOL, dastlab qamrov doirasini o'rnatish uchun bloklarni taqdim etdi. Bunga ko'plab lotin dasturlash tillari, shu jumladan, ruxsat berilgan C, C ++ va Java.

The C # til bu an'anani buzadi, chunki ichki va tashqi sinf o'rtasida va metodi bilan uning tarkibidagi sinf o'rtasida o'zgaruvchan soyalar paydo bo'lishiga imkon beradi, lekin if-blok va uning tarkibidagi usul o'rtasida yoki almashtirish blokirovka qilish.

Ba'zi tillar boshqalarga qaraganda ko'proq hollarda o'zgaruvchan soyalarni yaratishga imkon beradi. Masalan Kotlin funktsiyadagi ichki o'zgaruvchiga o'tgan argumentni soya qilishiga va ichki blokdagi o'zgaruvchini tashqi blokda boshqasini soya qilishiga ruxsat bering Java bunga yo'l qo'ymaydi. Ikkala til ham Sinf maydonini soya qilish uchun funktsiya / usulga o'tgan argumentga ruxsat beradi.[1]

Ba'zi tillar o'zgaruvchan soya berishga to'liq yo'l qo'ymaydi, masalan CoffeeScript.[2]

Misol

Lua

Quyidagi Lua kod bir nechta bloklarda o'zgaruvchan soyaning namunasini beradi.

v = 1 - global o'zgaruvchiqil  mahalliy v = v + 1 - global soyani soya qiladigan yangi mahalliy  chop etish(v) - 2-nashr  qil    mahalliy v = v * 2 - tashqi mahalliy soyani soyalashtiradigan yana bir mahalliy v    chop etish(v) - 4-nashr  oxiri  chop etish(v) - 2-nashroxirichop etish(v) - 1 bosadi

Python

Quyidagi Python kod o'zgaruvchan soyaning yana bir misoli keltirilgan:

x = 0def tashqi():    x = 1    def ichki():        x = 2        chop etish("ichki:", x)    ichki()    chop etish("tashqi:", x)tashqi()chop etish("global:", x)# tazyiqlar# ichki: 2# tashqi: 1# global: 0

O'zgaruvchan deklaratsiya mavjud emasligi sababli, Python-da faqat o'zgaruvchini tayinlash, kalit so'z mahalliy bo'lmagan Python 3-ga kiritilgan o'zgaruvchan soyani oldini olish va mahalliy bo'lmagan o'zgaruvchilarga tayinlash uchun ishlatiladi:

x = 0def tashqi():    x = 1    def ichki():        mahalliy bo'lmagan x        x = 2        chop etish("ichki:", x)    ichki()    chop etish("tashqi:", x)tashqi()chop etish("global:", x)# tazyiqlar# ichki: 2# tashqi: 2# global: 0

Kalit so'z global o'zgaruvchan soyani oldini olish va global o'zgaruvchilarga tayinlash uchun ishlatiladi:

x = 0def tashqi():    x = 1    def ichki():        global x        x = 2        chop etish("ichki:", x)    ichki()    chop etish("tashqi:", x)tashqi()chop etish("global:", x)# tazyiqlar# ichki: 2# tashqi: 1# global: 2

Zang

fn asosiy(){ruxsat beringx=0;{ruxsat beringx=1;println!("Ichki x: {}",x);// bosib chiqaradi 1}println!("Tashqi x: {}",x);// 0 ni bosib chiqaradi// Soyaruxsat beringx="Zang";println!("Tashqi x: {}",x);// "Rust" ni bosib chiqaradi}// # Ichki x: 1// # Tashqi x: 0// # Tashqi x: Rust

C ++

# shu jumladan <iostream>int asosiy(){  int x = 42;  int sum = 0;  uchun (int men = 0; men < 10; men++) {    int x = men;    std::cout << "x:" << x << ''; // i qiymatlarini 0 dan 9 gacha bosib chiqaradi    sum += x;  }  std::cout << "sum:" << sum << '';  std::cout << "x:" << x   << ''; // 42 ni chiqaradi  qaytish 0;}

Java

jamoat sinf Soya {    xususiy int myIntVar = 0;    jamoat bekor shadowTheVar() {        // yuqoridagi ob'ekt namunasi maydoni bilan bir xil nomga ega bo'lgani uchun, yuqorida soyada bo'ladi         // ushbu usul ichidagi maydon        int myIntVar = 5;        // Agar shunchaki 'myIntVar' ga murojaat qilsak, ushbu usuldan biri topilgan         // (xuddi shu nom bilan ikkinchisini soyalash)        Tizim.chiqib.println(myIntVar); // 5-ni bosib chiqaradi        // Agar biz ushbu sinfdan soyali myIntVar-ga murojaat qilmoqchi bo'lsak, kerak         // shunga o'xshash tarzda murojaat qiling:        Tizim.chiqib.println(bu.myIntVar); // 0 ni bosib chiqaradi    }    jamoat statik bekor asosiy(Ip[] kamon){        yangi Soya().shadowTheVar();    }}

JavaScript

ECMAScript 6-ning blokirovkalash doirasi bilan "let`" va "const" kiritilishi o'zgaruvchan soya solishga imkon beradi.

funktsiya myFunc() {    ruxsat bering my_var = "sinov";    agar (to'g'ri) {        ruxsat bering my_var = "yangi sinov";        konsol.jurnal(my_var); // yangi test    }    konsol.jurnal(my_var); // sinov}myFunc();

Shuningdek qarang

Adabiyotlar