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_titleを参照します。s.title

文字列を実際にコピーObject#dupするには、次のいずれかを使用します。

original_title = s.title.dup

dup→an_object

objの浅いコピーを生成します…</p>

またはString.new

original_title = String.new(s.title)

new(str = "")→new_str

strのコピーを含む新しい文字列オブジェクトを返します。

于 2012-07-13T12:42:58.883 に答える
3

ruby の変数は、デフォルトでオブジェクトをコピーするのではなく、それらが指すオブジェクトを参照します。したがって、基になるオブジェクトを変更すると、そのオブジェクトへの参照を含むすべての変数に変更が反映されます。

a、b、c、および d がすべて同じオブジェクトを指している場合、any への変更はそれらすべてを「変更」します (透けて見えます)。

  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 に答える