5

9.3 我的行为很奇怪,我不明白为什么:

s = self.shopify_p
s.title
=> "Disco (Wholesale)"

现在我想要一个包含 s.title 内容的新变量,没有“(批发)”部分。所以我做了以下事情:

original_title = s.title
=> "Disco (Wholesale)" 
original_title[" (Wholesale)"] = ""
=> ""

现在,如果我这样做:

original_title
=> "Disco"

没关系,但奇怪的是,最后一个字符串替换似乎甚至影响了原始的 s 变量:

s.title
=> "Disco"

我真的无法理解……你能告诉我这里发生了什么吗?

s.title 仍然应该是“Disco (Wholesale)”...或者不是?

4

3 回答 3

10

这是相同的,因为您访问的是同一个对象。

irb(main):006:0> x = "aaaa"
=> "aaaa"
irb(main):007:0> y = x 
=> "aaaa"
irb(main):008:0> x.object_id 
=> 70358166435920
irb(main):009:0> y.object_id
=> 70358166435920
irb(main):010:0> 

你可以做的是

original_title = s.title.gsub(" (Wholesale)","")
于 2012-07-13T12:39:35.817 回答
7

original_title = s.title两者之后original_titles.title引用同一个对象。

要实际复制字符串,请使用Object#dup

original_title = s.title.dup

重复 → an_object

生成obj的浅拷贝……</p>

String.new

original_title = String.new(s.title)

新的(str="") → 新的_str

返回一个包含str副本的新字符串对象。

于 2012-07-13T12:42:58.883 回答
3

ruby 中的变量默认引用它们指向的对象,而不是复制它们。因此,如果您更改基础对象,任何更改都将显示在包含对该对象的引用的任何变量中。

如果 a、b、c 和 d 都指向同一个对象,则对任何对象的更改都将“更改”(通过它们可见)。

  a  b  c
   \ | /
   Object
     |
     d

如果您想保留原始值,则需要以某种方式创建一个新变量。

irb(main):001:0> a = "Foo"
=> "Foo"
irb(main):002:0> b = a
=> "Foo"
irb(main):003:0> a << " Bar"
=> "Foo Bar"
irb(main):004:0> b
=> "Foo Bar"
irb(main):005:0> a
=> "Foo Bar"
irb(main):006:0> a += " Baz"
=> "Foo Bar Baz"
irb(main):007:0> a
=> "Foo Bar Baz"
irb(main):008:0> b
=> "Foo Bar"

对于您的情况,@wlad 的 gsub(请注意,他没有使用 gsub!)建议似乎是一个不错的建议。

original_title = s.title.gsub(" (Wholesale)","")
于 2012-07-13T12:51:45.900 回答