سؤال

x = "hello" " world".to_sym
puts x.class

يعمل هذا ويسمح لي بربط السلسلتين في رمز، مما ينتج عنه الإخراج:

Symbol

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

x = "hello" + " world".to_sym
puts x.class

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

in `+': can't convert Symbol into String (TypeError)

انا اتسائل ما الذي يجعل المثال الأول يعمل؟هل يعرف أحدكم ما هو ترتيب العمليات هنا؟أظن أنه يتم التعامل مع السلسلتين كسلسلة واحدة، حيث يتم تجاهل المسافة بينهما ويتم ربطهما قبل استدعاء الأسلوب to_sym.في الواقع كنت أتوقع أن يعمل بشكل لا يختلف عن المثال الثاني لأنني اعتقدت أنه سيتم استدعاء to_sym في السلسلة "world" قبل إجراء أي محاولة لربط محتويات "hello" و"world".

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

المحلول

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

"hello" " world"

إلى الرمز الوحيد string "hello world" ويتحول

"hello" + " world"

إلى ثلاثة علامات: string "hello", method +, ، و string " world".ثم يقوم بعد ذلك بتسلسل السلاسل معًا لاحقًا عند تنفيذ التعليمات البرمجية فعليًا.

نصائح أخرى

المثال الأول هو السكر النحوي، وعادة ما ترى هذا مكتوبًا مثل:

x = "Here is a string that " \
    "I want to split across " \
    "several lines..."

لذلك يحدث هذا أولاً، من قبل to_sym.في المثال الثاني أنت تتصل حرفيًا:

x = "hello".+( "world".to_sym )

والذي من الواضح أنه لن ينجح منذ ذلك الحين String#+ لا يمكن فعل أي شيء مفيد باستخدام الرمز كوسيطة.

باختصار، لا تفعل الأمر الأول، إذا كنت تريد أن تفعله "hello world".to_sym ولا يمكنك كتابتها بهذه الطريقة لأي سبب من الأسباب، فما عليك سوى استخدام الأقواس: ("hello" + " world").to_sym

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