هو PHP و C ++ الأماكن الوحيدة التي نحتاجها حذرين حول ما يشبه القيمة المارة هو بالفعل مرجع مرجعي؟

StackOverflow https://stackoverflow.com/questions/937585

سؤال

هو PHP و C ++ الأماكن 2 الوحيدة التي نحتاجها حذرين عن تمرير متغير نوع بيانات بسيط كوسيطة دالة ويمكن تغيير القيمة؟

مثل

$count = 2;
foo($count);
echo $count;

والطريق الثالث، وعرض Echo $ عد شيء آخر غير 2. أعرف فقط من PHP و C ++ حيث يمكن أن يحدث. هل هناك أي مكان آخر يمكن أن يحدث فيه؟

تحديث: وهذا هو، ما يبدو وكأنه "تمرير القيمة" هو في الواقع "تمر بالرجوع إليه". إذا كان يمر كائنا في Java و Perl و PHP و Python و Ruby ماذا عن المرور في غير كائن؟

هل كانت مفيدة؟

المحلول

العديد من اللغات الأخرى تدعم مثل "تمرير حسب المرجع" - بيرل، Fortran، Pascal، Visual Basic، ...

ما الذي تهتم به، حسنا، من الصعب علينا أن نقول! -)

تحرير: في التحديث الخاص بك، قمت بوضع Java و Python في نفس الفئة، ولكن هذا خطأ: لا يمكنك إعادة إنتاج مثالك مع (Java):

  int count = 2;
  whatever(count);
  /* count here is CERTAIN to be still 2 */

أو (بيثون):

count = 2
whatever(count)
# count here is CERTAIN to be still 2

يعرف أسلوب Python و Java أحيانا باسم "مرجع الكائن" (بدلا من "المرجع المتغير"): ما هو مرت (أو المعين) هو إشارة إلى الكائن (لذلك إذا كان الكائن يحتوي على المطاحور التي يمكن أن يحصل عليها callee تلك الموجاتين و وبالتالي تغيير الكائن)، وليس إلى "متغير" (بحيث بعد استدعاء المتغير، إذا كان أي، تستخدم لتمرير الوسيطة، لا يزال يشير إلى نفس الكائن، أبدا كائن آخر). هذا التمييز واضح لمعرفة كائنات ثابتة، مثل (في كل من Java and Python) الأرقام والسلاسل.

نصائح أخرى

لا يمكنك تغيير متغير في C ++ إلا إذا كنت صراحة تحديدها كمرجع. إذا كان لديك حجج منتظمة (غير مرجعية)، فهي نسخ ويمكن ليس كن متغير. إذا قرأت وفهم API، فلا حاجة إلى أن تكون حذرا حول تمرير متغير نوع بيانات بسيط كوسائط لوظيفة.

void func(type & arg);

يمكن تغييرها و

void func(type arg);

لا يمكن. وعادة ما تكون في C ++، لن تكون حجة مرجعية ما لم تكن API تريد تغيير القيمة في المقام الأول (معلمة الإخراج).

وكما ذكر أليكس بالفعل هناك العديد من اللغات التي تدعم تمر بالرجوع لغة. مثل.

كنت بحاجة فقط إلى أن تكون حذرا إذا كانت اللغة تجعلها لا صافي إذا تم تمرير المتغير بالقيمة أو بالتزكية.

مرة أخرى في الأيام الخوالي، انتقل فورتران الثوابت بالرجوع. يمكنك تمرير الثابت 2 إلى روتين فرعي ويمكن أن تخصص الروتين الفرعي 3 له. ثم بعد العودة، هذا الرمز

x = 2 + 2

من شأنه تعيين x إلى 6. لا أعرف ما إذا كانت مترجمات فورتران الحديثة تسمح بحدوث ذلك.

بعد المناقشة أعلاه، تعلمت مؤخرا أن استخدام تصميم لغة البرمجة Y من مصطلح "مرجع مرجعي" صارم للغاية، وعلى سبيل المثال في Java هو في الواقع فقط تمرير القيمة، بدقة.

إما، يمكنك تمرير قيمة بدائية (واضحة للجميع من المفترض) أو تمرير مرجع إلى كائن حسب القيمة. حسنا أنني أفهم الآن بعد النظر في رمز PERL التالي.

sub addFoo {
  my ($arrayRef) = @_;
  push @{$arrayRef},"foo"; 
}

my @array = (1,2,3);
my $arrayRef; # FUTURE reference (equivalent to pointer C) to @array.

addFoo($arrayref = \@array); #1.
addFoo(\@array); #2.
addFoo($arrayRef); #3.

print join(" ",@array),"\n"; # result "1 2 3 foo foo foo\n";

سؤالي إذا كان أي من ثلاث مكالمات بديلة إلى AddFoo، يعتبر مرجعا عبر الإدراك بدلا من مرجع المرور؟ يبدو أن الإجابة واضحة للعدد الثالث، لكنني لا أستطيع أن أقول للعدد رقم 1. # 2. كما تفعل بالضبط نفسه. يعتبر الرقم 2 على الأقل بشكل صريح كمرجع تمرير في بعض صفحات Perl Man ومواقع الويب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top