ما هو الفرق بين عددي و قائمة السياقات في بيرل?

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

  •  22-08-2019
  •  | 
  •  

سؤال

ما هو الفرق بين عددي و قائمة السياقات في بيرل لا مثيل لها في اللغات الأخرى مثل جافا أو جافا سكريبت ؟

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

المحلول

مختلف المشغلين في بيرل السياق الحساسة و تنتج نتائج مختلفة في قائمة سياق الحجمي.

على سبيل المثال:

my(@array) = (1, 2, 4, 8, 16);
my($first) = @array;
my(@copy1) = @array;
my @copy2  = @array;
my $count  = @array;

print "array: @array\n";
print "first: $first\n";
print "copy1: @copy1\n";
print "copy2: @copy2\n";
print "count: $count\n";

الإخراج:

array: 1 2 4 8 16
first: 1
copy1: 1 2 4 8 16
copy2: 1 2 4 8 16
count: 5

الآن:

  • $first يحتوي على 1 (العنصر الأول من الصفيف) ، لأن الأقواس في my($first) توفر مجموعة السياق ، ولكن هناك مساحة قيمة واحدة في $first.
  • سواء @copy1 و @copy2 تحتوي على نسخة من @array,
  • و $count يحتوي على 5 لأنه هو سياق الحجمي ، @array يقيم عدد العناصر في الصفيف في سياق الحجمي.

أكثر تفصيلا الأمثلة يمكن أن يتم بناؤها أيضا (نتائج ممارسة للقارئ):

my($item1, $item2, @rest) = @array;
my(@copy3, @copy4) = @array, @array;

لا يوجد المباشر موازية قائمة سياق الحجمي في اللغات الأخرى التي لا أعرف.

نصائح أخرى

والسياق عددي هو ما تحصل عليه عندما كنت تبحث عن قيمة واحدة. قائمة السياق هو ما تحصل عليه عندما كنت تبحث عن قيم متعددة. واحدة من الأماكن الأكثر شيوعا لرؤية التمييز وعند العمل مع صفائف:

@x = @array;  # copy an array
$x = @array;  # get the number of elements in an array

والمشغلين وظائف أخرى هي السياق حساسة أيضا:

$x   = 'abc' =~ /(\w+)/;  # $x = 1
($x) = 'abc' =~ /(\w+)/;  # $x = 'abc'
@x   = localtime();       # (seconds, minutes, hours...)
$x   = localtime();       # 'Thu Dec 18 10:02:17 2008'

وكيف عامل (أو وظيفة) يتصرف في سياق معين متروك للمشغل. لا توجد قواعد عامة لكيفية المفترض الأمور على التصرف.

ويمكنك جعل السياق الوظائف الفرعية الخاصة بك حساسة باستخدام الدالة wantarray تحديد سياق الاستدعاء. يمكنك فرض تعبير ليتم تقييمها في سياق العددية باستخدام الكلمة scalar.

وبالإضافة إلى العددية وقائمة السياقات سترى أيضا "باطلة" (لا قيمة العائد المتوقع)، و "منطقية" (أ الحقيقية / قيمة زائفة المتوقع) السياقات المذكورة في الوثائق.

وهذا يعني ببساطة أن نوع البيانات التي سيتم تقييمها على أساس وضع العملية. على سبيل المثال، واجب لالعددية يعني من الناحية اليمنى وسيتم تقييم بمثابة العددية.

وأعتقد أن أفضل وسيلة لفهم السياق هو تعلم wantarray. لذلك أتصور أن = هو روتين التي تطبق wantarray:

sub = {
  return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)
  return @_ if ( wantarray ); # list: return the array
  return $#_ + 1; # scalar: return the count of the @_
}

والأمثلة في هذا العمل آخر كما لو يسمى روتين أعلاه عن طريق تمرير الجانب الأيمن كمعلمة.

وأما بالنسبة لأوجه الشبه في لغات أخرى، نعم، وأنا لا تزال تحافظ على أن كل لغة تقريبا تدعم شيئا من هذا القبيل. تعدد الأشكال مشابهة في جميع اللغات OO. مثال آخر، جافا يحول الأشياء إلى سلسلة في سياقات معينة. وكل لغة البرمجة مصنف لقد استعملت لديها مفاهيم مماثلة.

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