Ruby怪异的赋值行为

jay*_*ode 2 ruby

这是一个红宝石虫吗?

target_url_to_edit = target_url

if target_url_to_edit.include?("http://")
  target_url_to_edit["http://"] = ""
end

logger.debug "target url is now #{target_url}"
Run Code Online (Sandbox Code Playgroud)

这将返回不带http://的target_url

hur*_*n77 10

您需要复制内存中对象,因为变量名只是对内存中对象的引用:

target_url_to_edit = target_url.dup
Run Code Online (Sandbox Code Playgroud)

现在target_url_to_edit为其分配原始对象的新副本.

对于您的情况,此代码可能只在一行中执行相同操作(无重复,否则如果):

target_url_to_edit = target_url.sub(%r{^http://}, "")
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 5

不,这不是Ruby中的错误,这就是共享可变状态的工作原理,不仅仅是在Ruby中,而是在任何编程语言中.

想一想:我的妈妈称我为"儿子",我的朋友称我为"Jörg".如果我剪了头发,那么你用哪个名字来引用我并不重要:我是同一个人,无论你是叫"儿子"还是"Jörg"或"Mittag先生"还是"嘿, douchebag",因此我的头发总是很短.如果你用不同的名字给我打电话,它就不会神奇地重新成长.

您的代码中也会发生同样的事情:您通过两个不同的名称引用字符串,但使用哪个名称并不重要; 如果字符串发生变化,则会发生变化.

当然,解决方案是不共享可变状态而不是改变共享状态,就像在@hurikhan77的回答中一样.