首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Ruby Gsub

关于Ruby Gsub
EN

Stack Overflow用户
提问于 2010-02-08 03:12:46
回答 3查看 358关注 0票数 1
代码语言:javascript
复制
params[:hello] # => "Some params value"

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

params[:hello] # => ""

我不明白,有没有人能解释一下为什么gsub!会修改params[:hello]?我期望修改的是hello字符串,而不是params散列。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-08 03:15:57

helloparams[:hello]是对同一字符串的引用。在ruby (如java和python等)中,赋值不会复制值,它只是在赋值的变量中存储对相同值的另一个引用。因此,除非在修改字符串之前显式复制它(使用dup),否则对该字符串的任何更改都将影响对该字符串的所有其他引用。

票数 6
EN

Stack Overflow用户

发布于 2010-02-08 03:37:36

有两个版本的String#gsub可用

代码语言:javascript
复制
a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"

String#gsub!修改原始字符串并返回对它的引用。String#gsub不会修改原始文件,而会在副本上进行替换。

给使用!修改对象的方法命名是一种常见的ruby习惯用法。

票数 2
EN

Stack Overflow用户

发布于 2010-02-08 03:14:45

如果你不想修改它,你需要克隆它,如下所示:

代码语言:javascript
复制
hello = params[:hello].clone

以你现在的方式,你有一个引用,而不是一个副本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2217917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档