سؤال

params[:hello] # => "Some params value"

hello = params[:hello]
hello.gsub!("whatever","")

params[:hello] # => ""

أنا لا أفهم، هل يمكن لشخص ما يرجى توضيح سبب params[:hello] يتم تعديلها من قبل gsub! ب كنت أتوقع hello سلسلة ليتم تعديلها، ولكن ليس params التجزئة.

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

المحلول

hello و params[:hello] هي مراجع إلى نفس السلسلة. في Ruby (كما هو الحال في Java و Python من بين آخرين) لا يتم نسخ المهمة القيمة، فإنها تخزن مرجعا آخر إلى نفس القيمة في المتغير المخصص. لذلك ما لم نسخ السلسلة بشكل صريح قبل تعديله (باستخدام dup) سيؤثر أي تغييرات على السلسلة على جميع المراجع الأخرى إلى السلسلة.

نصائح أخرى

هناك نسختان من String#gsub متوفر

a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"

String#gsub! يعدل السلسلة الأصلية وإرجاع مرجعا إليه.String#gsub لا تعديل الأصل ويجعل البديل على نسخة.

إنه المصطلح المشترك لطريق الأسماء التي تعدل الكائن ب !.

إذا كنت لا تريد تعديلها، فأنت بحاجة إلى استنساخها، مثل:

hello = params[:hello].clone

الطريقة التي تقوم بها الآن، لديك إشارة إليها، وليس نسخة.

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