122 lines
5.1 KiB
Markdown
122 lines
5.1 KiB
Markdown
|
---
|
||
|
title: Ruby Symbols
|
||
|
localeTitle: روبي الرموز
|
||
|
---
|
||
|
## روبي الرموز
|
||
|
|
||
|
يشبه الرمز اسم المتغير ولكنه مسبوقًا بنقطتين. أمثلة -: الإجراء ،: line\_items. ليس عليك أن تعلن عن رمز مسبق وأن تكون مضمونة لتكون فريدة من نوعها. ليس هناك حاجة لتعيين نوع من القيمة لرمز - يعتني روبي بذلك بالنسبة لك. يضمن Ruby أيضًا أنه بغض النظر عن مكان ظهوره في برنامجك ، سيكون له رمز معين نفس القيمة.
|
||
|
|
||
|
بدلاً من ذلك ، يمكنك اعتبار القولون يعني "الشيء المسمى" ، لذلك: id هو "الاسم المسمى id". يمكنك أيضًا التفكير في: id على أنه يعني اسم معرف المتغير ، والمعرف العادي على أنه يعني قيمة المتغير.
|
||
|
|
||
|
على سبيل المثال: إذا كان Fred ثابتًا في سياق واحد ، وطريقة في أخرى ، وفئة في الثلث ، فسيكون الرمز: Fred هو نفس الكائن في جميع السياقات الثلاثة.
|
||
|
|
||
|
`module One
|
||
|
class Fred
|
||
|
end
|
||
|
$f1 = :Fred
|
||
|
end
|
||
|
module Two
|
||
|
Fred = 1
|
||
|
$f2 = :Fred
|
||
|
end
|
||
|
def Fred()
|
||
|
end
|
||
|
$f3 = :Fred
|
||
|
$f1.object_id #=> 2514190
|
||
|
$f2.object_id #=> 2514190
|
||
|
$f3.object_id #=> 2514190
|
||
|
`
|
||
|
|
||
|
## العمل مع الرموز
|
||
|
|
||
|
يمكنك التعرف على رمز Ruby لأنه سيكون كلمة تبدأ بـ:.
|
||
|
|
||
|
حتى الآن رأيناهم كمفتاح في هاش (العمل مع الزنانير في روبي):
|
||
|
|
||
|
`person = {:name => "Philip"}
|
||
|
`
|
||
|
|
||
|
لذا ، فإن أول شيء يمكننا القيام به هو فحص الرمز لمعرفة الفئة التي يستخدمها:
|
||
|
|
||
|
`:hello.class
|
||
|
=> Symbol
|
||
|
|
||
|
"hello".class
|
||
|
=> String
|
||
|
`
|
||
|
|
||
|
حتى يمكننا أن نرى أن الرموز والسلاسل هي أمثلة لكائنين مختلفين.
|
||
|
|
||
|
يمكنك الاتصال بأساليب شبيهة `upcase` ، مثل `upcase` ، و `downcase` ، `capitalize` الرموز:
|
||
|
|
||
|
`:hello.upcase
|
||
|
=> :HELLO
|
||
|
|
||
|
:HELLO.downcase
|
||
|
=> :hello
|
||
|
|
||
|
:hello.capitalize
|
||
|
=> :Hello
|
||
|
`
|
||
|
|
||
|
## لماذا تستخدم رمزًا بدلاً من سلسلة؟
|
||
|
|
||
|
إذا كان الرمز مجرد سلسلة غير قابلة للتغيير ، فلماذا تستخدمها ، ولماذا يوجد تمييز خاص في روبي؟
|
||
|
|
||
|
## الرموز هي غير قابل للتغيير
|
||
|
|
||
|
أولاً ، أحد الأسباب الرئيسية هو ، كما ذكرت أعلاه ، أن الرموز غير قابلة للتغيير. يمكن أن تظهر أخطاء غير متوقعة في التطبيق الخاص بك عندما يمكن تغيير قيمة. إذا كنت بحاجة إلى التأكد من عدم تغيير قيمة الكائن أبدًا ، يكون استخدام كائن غير قابل للتغيير أكثر أمانًا.
|
||
|
|
||
|
ومع ذلك ، مع ذلك ، يمكن إجراء سلسلة غير قابلة للتغيير في Ruby عن طريق استدعاء طريقة `freeze` :
|
||
|
|
||
|
`name = "Philip"
|
||
|
=> "Philip"
|
||
|
|
||
|
name.freeze
|
||
|
=> "Philip"
|
||
|
|
||
|
name << "Jim"
|
||
|
RuntimeError: can't modify frozen String
|
||
|
`
|
||
|
|
||
|
كما ترى في المثال أعلاه ، بمجرد استدعاء طريقة التجميد على مثيل سلسلة ، لن يمكنك تعديله بعد الآن.
|
||
|
|
||
|
فلماذا يمكنك استخدام الرموز بدلاً من السلاسل؟
|
||
|
|
||
|
#### الرموز أفضل للأداء
|
||
|
|
||
|
السبب الثاني وراء استخدامك لـ Symbol على إحدى سلاسل String في مواقف معينة هو أن الرموز أفضل بكثير من حيث الأداء.
|
||
|
|
||
|
فمثلا:
|
||
|
|
||
|
`philip".object_id
|
||
|
=> 70288511587360
|
||
|
"philip".object_id
|
||
|
=> 70288504327720
|
||
|
|
||
|
:philip.object_id
|
||
|
=> 539368
|
||
|
:philip.object_id
|
||
|
=> 539368
|
||
|
`
|
||
|
|
||
|
عند إنشاء كائنين سلسلة بنفس القيمة ، يتم التعامل مع هذين العنصرين ككائنين مختلفين. عند إنشاء رمز ، سيستخدم الرجوع إلى الرمز دائمًا نفس الكائن.
|
||
|
|
||
|
هذا أفضل بكثير للأداء نظرًا لأنه سيتم إنشاء نفس كائن السلسلة وتدميره مرارًا وتكرارًا ، في حين أنه في الواقع يمكن إعادة استخدام الكائن نفسه في كل مرة.
|
||
|
|
||
|
#### طرق الطبقة العامة
|
||
|
|
||
|
all\_symbols => نقر المصفوفة لتبديل المصدر لإرجاع مجموعة من الرموز الموجودة حاليًا في جدول رمز Ruby.
|
||
|
|
||
|
`Symbol.all_symbols.size #=> 903
|
||
|
Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink,
|
||
|
:chown, :EOFError, :$;, :String,
|
||
|
:LOCK_SH, :"setuid?", :$<,
|
||
|
:default_proc, :compact, :extend,
|
||
|
:Tms, :getwd, :$=, :ThreadGroup,
|
||
|
:wait2, :$>]
|
||
|
`
|
||
|
|
||
|
#### معلومات اكثر:
|
||
|
|
||
|
[روبي الرموز الوثائق](http://ruby-doc.org/core-2.5.1/Symbol.html)
|