سؤال

ما الفرق بين السلسلة والرمز في روبي ومتى يجب عليك استخدام أحدهما على الآخر؟

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

المحلول

والفرق الرئيسي هو أن رموز متعددة تمثل قيمة واحدة متطابقة في حين أن هذا غير صحيح مع السلاسل. على سبيل المثال:

irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618

و3 إشارات إلى الرمز: الاختبار، كل نفس الكائن

irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948

و3 يشير إلى السلسلة "اختبار"، وكلها أشياء مختلفة.

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

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

نصائح أخرى

ما هي الاختلافات بين الرموز والسلاسل؟

  1. الرموز غير قابلة للتغيير:وتبقى قيمتها ثابتة.
  2. الاستخدامات المتعددة لنفس الرمز لها نفس معرف الكائن وهي نفس الكائن مقارنة بالسلسلة التي ستكون كائنًا مختلفًا بمعرف كائن فريد في كل مرة.
  3. لا يمكنك استدعاء أي من أساليب السلسلة مثل #split على الرموز.

من فهم الاختلافات بين الرموز والسلاسل في روبي

إذا كنت صينيًا، يمكنك أيضًا القراءة 理解 رمز روبي

البيان

foo = "bar"

إنشاء كائن جديد في الذاكرة.إذا كررنا البيان

foo = "bar"

نقوم بإنشاء كائن آخر

للحصول عليه بشكل أكثر وضوحًا، يرجى تجربة الكود أدناه على وحدة تحكم روبي

foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"

سوف تحصل على إخراج مثل

string bar with object id = 70358547221180
string bar with object id = 70358548927060

مما يوضح بوضوح أن هناك كائنين مختلفين لنفس السلسلة.الآن إذا استخدمت الرمز فسوف يتم إنشاؤه كائن واحد لكل رمز لذا

foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"

عروض

symbol bar with object id = 7523228
symbol bar with object id = 7523228

مما يعني أن هناك كائنًا واحدًا فقط لـ :bar

مزيد من الرموز هي غير قابل للتغيير ولا يمكنك الاتصال بأي من أساليب السلسلة مثل #upcase, #split على الرموز.

مقارنة الرموز أسرع من مقارنة السلاسل.

يمكن اعتبار الرموز بمثابة سلاسل ثابتة/غير قابلة للتغيير تشكل مجموعة فريدة يتم تحويلها بشكل فعال إلى مؤشرات ذاكرة على الكومة.وهذا يعني أن مقارنة رمزين تكون سريعة لأنك تقوم فقط بمقارنة عددين صحيحين (مؤشرات الذاكرة).

السلاسل قابلة للتغيير بحيث يمكن أن يتغير مؤشر الذاكرة لقيمتها في الكومة بعد التعديل.وهذا يعني أن عمليات المقارنة تكون أبطأ لأنه من الممكن وجود نسخ مكررة متكافئة لغويًا.

الاستخدامات

يستخدم Symbol عندما تتأكد من أن القيمة ستبقى ثابتة.مثال استخدم الرموز لمفاتيح التجزئة ، استخدم السلسلة عندما تريد تغيير القيمة أو تريد استخدام طريقة السلسلة عليها.

وهناك فرق إضافية بين String وSymbol هو أن String ديه الكثير من الطرق عليه لسلسلة التلاعب، في حين أن Symbol هو كائن الهزيل نسبيا.

وتحقق من وثائق الطبقة String و< وأ href = "http://www.ruby-doc.org/core/classes/Symbol.html" يختلط = "نوفولو noreferrer"> الطبقة Symbol .

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

وجدت فقط هذا عن طريق البريد الإلكتروني، والتي قد تقدم مزيدا من التفاصيل: <لأ href = "http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols" يختلط = "نوفولو noreferrer "> هنا تذهب

وسلاسل هي قابلة للتغيير، الرموز أري غير قابل للتغيير
ملاحظة: كائنات قابلة للتغيير يمكن أن تتغير بعد الاحالة في حين يمكن الأجسام الثابتة فقط تكون الكتابة HTTP: //www.robertsosinski. كوم / 2009 / 11/01 / والاختلاف بين روبي-حرف وسلاسل /

هناك اختلافان رئيسيان بين السلسلة والرمز في روبي.

  1. السلسلة قابلة للتغيير والرمز ليس كذلك

    • نظرًا لأن السلسلة قابلة للتغيير، فمن الممكن أن تتغير في مكان ما ويمكن أن تؤدي إلى نتيجة غير صحيحة.

    • الرمز غير قابل للتغيير.

  2. السلسلة عبارة عن كائن لذا فهي تحتاج إلى تخصيص الذاكرة

    يضع "abc".object_id # 70322858612020

    يضع "abc".object_id # 70322846847380

    يضع "abc".object_id # 70322846815460

من ناحية أخرى، الرمز سوف يعطيك نفس الكائن:

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

لذا فإن السلسلة ستستغرق وقتًا أطول في الاستخدام والمقارنة من الرمز.

يمكنك قراءة المزيد هنا لفهم كامل:

وحالة حيث رمز يمكن أن يكون كارثة. دعونا نقول لديك params.map(&:to_sym) في تحكم القضبان الخاصة بك. الآن هنا إذا كنت تقوم بتحويل البيانات المقدمة من قبل المستخدم إلى رمز لسبب فلا يمكن أن تكون خطيرة. إذا كانت البيانات المقدمة من قبل المستخدم كبيرة جدا وكما نعلم أن رمز ليست من هواة جمع القمامة، قد ينتهي بك الأمر استنفاد ذاكرة الخادم الخاص بك الذي يمكن TAKEDOWN موقع الويب الخاص بك.

والرموز والسلاسل مختلفة تماما rel="nofollow هذا المنصب ديه قليلا نظرة ثاقبة الاختلافات. إلى متى وإلى أين استخدامها، وهناك وظيفة واسعة جدا على هذا الموضوع على أكثر من <لأ href = "http://blog.hasmanythrough.com/2008/4/19/symbols-are-not-pretty-strings "يختلط =" نوفولو noreferrer "> لديه العديد من: من خلال

وكما الطباق، وهو صديق لي وكتبت مؤخرا وظيفة تحت عنوان "روبي التشدق" الذي يعطي نظرة أخرى على رموز روبي.

ورمز غير قابل للتغيير والسلسلة قابلة للتغيير.

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

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

لمزيد من المعلومات، فيمكنك انقر هنا

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