سؤال
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
الطريقة التي تقوم بها الآن، لديك إشارة إليها، وليس نسخة.