سؤال

في روبي بعض أساليب علامة استفهام (?) أن تسأل سؤال مثل include? أن تسأل إذا كان الكائن في السؤال يتم تضمين هذا ثم إرجاع true/false.

ولكن لماذا بعض أساليب علامات التعجب (!) حيث الآخرين لا ؟

ماذا يعني ذلك ؟

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

المحلول

في عام الطرق التي تنتهي في ! تشير إلى أن طريقة تعديل الكائن انه دعا على.روبي تدعو هذه "أساليب خطيرة"لأنهم تغيير الدولة أن شخصا آخر قد يكون إشارة إلى.وهنا مثال بسيط عن سلاسل:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

هذا الناتج:

a string

في المكتبات القياسية ، هناك الكثير من الأماكن سوف نرى أزواج وبالمثل اسمه الأساليب ، ! واحد دون.هم دون تسمى "الطرق الآمنة" و عودتهم نسخة أصلية مع التغييرات الحاصلة في نسخة, مع المستدعى دون تغيير.وهنا نفس المثال دون !:

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

هذه النواتج:

A STRING
a string

نضع في اعتبارنا هذا هو مجرد اتفاقية ، ولكن الكثير من روبي فصول متابعة ذلك.كما يساعدك على الحفاظ على المسار من ما يحصل تعديل في التعليمات البرمجية الخاصة بك.

نصائح أخرى

وتعجب تعني أشياء كثيرة، وأحيانا كنت لا أستطيع أن أقول الكثير منه غير "هذا أمر خطير، وتوخي الحذر".

وكما قال آخرون، في الأساليب القياسية انها غالبا ما تستخدم للإشارة إلى طريقة التي تسبب كائن لتتحول في حد ذاته، ولكن ليس دائما. لاحظ أن العديد من الأساليب القياسية تتغير المتلقي وليس لديها علامة تعجب (pop، shift، clear)، وبعض طرق مع علامات التعجب لا تتغير الاستقبال الخاصة بهم (exit!). انظر هذه المقالة على سبيل المثال.

وقد تستخدم مكتبات أخرى بشكل مختلف. في القضبان غالبا ما يعني تعجب أن الطريقة سوف بطرح استثناء على الفشل ليس فشل بصمت.

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

ويتم رفع اصطلاح تسمية هذا من مخطط .

<اقتباس فقرة>   

و1.3.5 اتفاقيات تسمية

     

ومن الاتفاقية، أسماء الإجراءات   التي دائما إرجاع قيمة منطقية   عادة ما تنتهي في ``؟ ''. هذه الإجراءات   ودعا المسندات.

     

ومن الاتفاقية، أسماء الإجراءات   أن القيم مخزن في السابق   المواقع المخصصة (انظر القسم 3.4)   عادة ما تنتهي في `` ''. هذه الإجراءات   تسمى إجراءات الطفرة. بواسطة   اتفاقية، القيمة التي تم إرجاعها من قبل   الإجراء طفرة غير محدد.

و! يعني عادة أن الطريقة يعمل على الكائن بدلا من العودة نتيجة لذلك. من كتاب البرمجة روبي :

<اقتباس فقرة>   

والطرق التي هي "خطير"، أو تعديل المتلقي، قد يكون اسمه مع زائدة "!".

ومن themomorohoax.com:

وA الانفجار يمكن استخدامها في الطرق التالية، من أجل بلدي تفضيل شخصي.

<اقتباس فقرة>   

1) أسلوب سجل نشط بإصدار خطأ إذا لم تفعل طريقة   ما تقول أنها ستفعل ذلك.

     

2) أسلوب السجل النشط يحفظ سجل أو الأسلوب يوفر ل   الكائن (مثل شريط!)

     

و3) وهناك طريقة يفعل شيئا "إضافية"، مثل وظائف لمكان ما، أو لا   بعض الإجراءات.

وهذه النقطة هي: فقط استخدام أحدثت دويا عندما كنت قد فكرت حول ما إذا كان حقا من الضروري، لحفظ مطورين آخرين الانزعاج من الاضطرار إلى تحقق لماذا كنت تستخدم الانفجار.

وفرقعة يوفر اثنين العظة لمطورين آخرين.

<اقتباس فقرة>   

1) أنه ليس من الضروري لحفظ الكائن بعد استدعاء   الأسلوب.

     

2) عند استدعاء الأسلوب، ديسيبل هو ذاهب إلى تغيير.

HTTP: // شبكة الاتصالات العالمية .themomorohoax.com / 2009 / 11/02 / عند الاستخدام واحد في الانفجار، تعجب نقطة بعد القضبان-طرق

وهو الأكثر دقة أن نقول إن طرق مع الانفجار! هي أكثر خطورة أو <وأ href = "HTTP: // ruby- doc.org/core-2.1.0/Array.html#method-i-collect-21 "يختلط =" نوفولو noreferrer "> المستغرب نسخة . هناك العديد من الطرق التي تتحور دون دوي مثل .destroy و في طرق العامة لدى الانفجارات فقط حيث يوجد بديل أكثر أمنا في ليب الأساسية.

وعلى سبيل المثال، في صفيف لدينا .compact و.compact!، كلتا الطريقتين تتحور مجموعة، ولكن يعود .compact! النيل بدلا من النفس إذا لم تكن هناك من لا شيء في المصفوفة، والتي هي أكثر إثارة للدهشة من مجرد الذات العودة.

وهذه الطريقة غير تحور فقط وجدتها مع اثارة ضجة غير Kernel في <لأ href = "http://ruby-doc.org/core-2.1.0/Kernel.html#method-i-exit-21 "يختلط =" نوفولو noreferrer "> .exit! الذي هو أكثر إثارة للدهشة من .exit لأنه لا يمكنك التقاط SystemExit في حين أن عملية تضيق.

والقضبان وأكتيفيريكورد استمر هذا الاتجاه في أنه يستخدم لفرقعة المزيد من الآثار 'مفاجئة' مثل .create! الأمر الذي يثير الأخطاء على فشل.

والتفسير بسيط:

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

ولكن إذا قمت بالاتصال من أي وقت مضى downcase! الأسلوب في التفسير أعلاه، foo ستتغير إلى downcase بشكل دائم. سوف downcase! لن يعود كائن سلسلة جديدة ولكن استبدال سلسلة في مكان، وتغيير تماما foo إلى downcase. أقترح عليك أن لا تستخدم downcase! إلا عند الضرورة تماما.

!

وأود أن أفكر في هذا الأمر والتغيير الهائل الذي يدمر كل ما قد ذهب قبل ذلك. فرقعة أو علامة تعجب يعني أنك إجراء تغيير حفظ دائم في التعليمات البرمجية.

إذا كنت تستخدم لطريقة سبيل المثال روبي لاستبدال substitutiongsub!the العالمي إجراء غير دائمة.

وهناك طريقة أخرى يمكنك أن تتخيل، يتم فتح ملف نصي والقيام البحث والاستبدال، تليها الادخار. ! يفعل نفس الشيء في التعليمات البرمجية.

وتذكرة مفيدة أخرى إذا كنت تأتي من العالم باش sed -i لديها هذا التأثير مشابه لإحداث التغيير حفظ دائم.

ودعا "طرق المدمرة" انها تميل الى تغيير النسخة الأصلية للكائن الذي تشير إليه.

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

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

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

وأنا أفضل أن تفعل شيئا مثل:

foo = "word"
bar = foo.capitalize
puts bar

وOR

foo = "word"
puts foo.capitalize

وبدلا من

foo = "word"
foo.capitalize!
puts foo

وفقط في حال أود أن الوصول إلى القيمة الأصلية مرة أخرى.

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