هل هناك أي طريقة لاستخدام "ثابت" كمفتاح تجزئة في بيرل؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

هل هناك أي طريقة لاستخدام ثابت كمفتاح التجزئة؟

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

use constant X => 1;

my %x = (X => 'X');

سيقوم الكود أعلاه بإنشاء تجزئة مع "X" كمفتاح وليس 1 كمفتاح.حيث أنني أريد استخدام قيمة الثابت X كمفتاح.

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

المحلول

use constant في الواقع يجعل الإجراءات الفرعية ثابتة.

للقيام بما تريد، تحتاج إلى استدعاء الفرع بشكل صريح:

use constant X => 1;

my %x = ( &X => 'X');

أو

use constant X => 1;

my %x = ( X() => 'X');

نصائح أخرى

هناك خيار آخر وهو عدم استخدام استخدام البراغما الثابتة والانتقال إلى القراءة فقط وفقًا للتوصيات الواردة في Perl Best Practices بقلم داميان كونواي.

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

يقوم بناء الجملة للقراءة فقط بإنشاء متغيرات "طبيعية المظهر"، ولكنها في الواقع ستفرض الثبات أو القراءة فقط.يمكنك استخدامه تمامًا كما تفعل مع أي متغير آخر كمفتاح.


use Readonly;

Readonly my $CONSTANT => 'Some value';

$hash{$CONSTANT} = 1;

مشكلتك هي أن => عبارة عن فاصلة سحرية تقتبس تلقائيًا الكلمة التي أمامها.إذن ما كتبته يعادل ('X'، 'X').

إن أبسط طريقة هي مجرد استخدام فاصلة:

my %x = (X, 'X');

أو يمكنك إضافة علامات ترقيم مختلفة بحيث لا يكون لديك كلمة بسيطة أمام =>:

my %x = ( X() => 'X' );
my %x = ( &X => 'X' );

يستخدم $hash{CONSTANT()} أو $hash{+CONSTANT} لمنع آلية الاقتباس من الكلمات المجردة من البدء.

من: http://perldoc.perl.org/constant.html

لقد أجاب معظم الأشخاص الآخرين على سؤالك جيدًا.تُنشئ هذه العناصر معًا شرحًا كاملاً للمشكلة والحلول الموصى بها.تكمن المشكلة في أن "استخدام ثابت" لـ Perl ينشئ بالفعل روتينًا فرعيًا في الحزمة الحالية واسمه هو الوسيطة الأولى للبراغما وقيمته هي الأخيرة.

في لغة Perl، بمجرد الإعلان عن روتين فرعي، يمكن استدعاؤه بدون أقواس.

من خلال فهم أن "الثوابت" هي مجرد إجراءات فرعية، يمكنك معرفة سبب عدم تحريفها في سلاسل ولماذا يعتقد عامل التشغيل "فاصلة كبيرة" "=>" الذي يقتبس الوسيطة اليسرى أنك سلمتها سلسلة (جرب أدوات أخرى مبنية -in وظائف مثل الوقت () والمفاتيح () في وقت ما مع الفاصلة السمينة لمزيد من المتعة).

لحسن الحظ، يمكنك استدعاء الثابت باستخدام علامات الترقيم الصريحة مثل الأقواس أو علامة الضم.

ومع ذلك، لدي سؤال لك:لماذا تستخدم الثوابت لمفاتيح التجزئة على الإطلاق؟

يمكنني التفكير في بعض السيناريوهات التي قد تقودك في هذا الاتجاه:

  1. تريد التحكم في المفاتيح التي يمكن أن تكون في التجزئة.

  2. تريد تجريد اسم المفاتيح في حالة تغييرها لاحقًا

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

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

نأمل أن يساعد هذا وشكرا على وقتك.

ال use constant تقوم pragma بإنشاء روتين فرعي نموذجي بحيث لا يأخذ أي وسيطات.بينما تبدو مثل ثابت النمط C، فهو في الواقع روتين فرعي يُرجع قيمة ثابتة.

ال => (فاصلة كبيرة) تقتبس تلقائيًا المعامل الأيسر إذا كان مجرد كلمة، كما هو الحال مع تدوين $hash{key}.

إذا كان استخدامك للاسم الثابت يبدو وكأنه كلمة مجردة، فسيتم تفعيل آليات الاقتباس وستحصل على اسمه كمفتاح بدلاً من قيمته.ولمنع ذلك، قم بتغيير الاستخدام بحيث لا يكون مجرد كلام.على سبيل المثال:

use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;

في أدوات التهيئة، يمكنك أيضًا استخدام الفاصلة البسيطة بدلاً من ذلك:

%hash = (X, 1);

=> يفسر عامل التشغيل جانبه الأيسر على أنه "سلسلة"، بالطريقة التي يفعلها qw().

جرب استخدام

my %x = ( X, 'X');

إحدى الطرق هي تغليف X كـ (X):

my %x ( (X) => 1 );

هناك خيار آخر وهو التخلص من '=>' واستخدام ',' بدلاً من ذلك:

my %x ( X, 1 );

قم بالتعليق على @shelfoo (السمعة ليست عالية بما يكفي لإضافة تعليق هناك مباشرة حتى الآن!)

أوافق تمامًا على أفضل ممارسات Perl بقلم داميان كونواي...يوصى بشدة بقراءته.

ومع ذلك يرجى القراءة تعليق توصية وحدة PBP وهو "أخطاء" مفيدة إذا كنت تخطط لاستخدام PBP للحصول على دليل أسلوب داخلي.

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