2011-10-25 10 views
1

ユーザーからの入力を取得し、それを自分のニーズに変更するコードを書きました。私は変更された形式と変更されていない形式でそれを必要とするので、入力を2つの変数に保存しています。私が理解できないことは、両方の変数が変化している理由です。私は原因が何であるかを判断するためにいくつかの追加のputs行を試しましたが、私はそれを理解することができません。コード:入力して変数の変更

puts "Enter the full directory path of the flv files." 
folder = gets.chomp 
puts "Folder 1: " + folder 
path = folder 
path.slice!(0..6) 
path.gsub!('\\', '/') 
path += '/' 
puts "Folder: " + folder 
puts "Path: " + path 

:F:\フォルダ\サブフォルダ\別

出力:

Folder 1: f:\folder\subfolder\another 
Folder: folder/subfolder/another 
Path: folder/subfolder/another/ 

私はディレクトリを取得し、他のディレクトリを保っているためつもりですそれをURLフレンドリーなフォーマットに変換します。アイデア?

+0

を使用します。http://www.arnab-deka.com/posts/2009/07/ruby-dup-vs-clone/ – kafuchau

+0

可能な重複します。http ://stackoverflow.com/questions/1465569/ruby-how-can-i-copy-a-variable-with-pointing-to-the-ame-object – NickLH

答えて

5
path = folder # does not actually copy the object, copies the reference 
path.object_id == folder.object_id # the objects are the same, see 
path.slice!(0..6) # all bang methods work with the same object 

したがって、あなたのpathfolderと同じオブジェクトへの参照です。この問題を解決するには

、今後の参考のために

path = folder.clone 
+0

他の2つの答えはString#dupを使用します。 String#cloneの設定や利点はありますか? – lyonsinbeta

+1

@thekungfuman、この特定の場合 - 全く違いはありません。一般的に、 'clone'はオブジェクトの' frozen? '状態を保持し、 'dup'はオブジェクトの' frozen '状態を保持します。 http://danbri.org/words/2008/01/02/240 –

2

あなたがb = aを行うと、あなたがslice!のようなものを使用してaの値を変更すると、それはaと同じ値でbポイントを作っているので、bも変更された値を指します。これを避けるために

、代わりにオブジェクトを複製:

b = a.dup 
+0

これは簡単です。テスト済み。作品。迅速な対応に感謝します。 – lyonsinbeta

+1

括弧内のコメントが正しくありません。 'b = a'は' b'を 'a'と同じオブジェクトを指すようにしますが、それは浅いコピーではありません。 'dup'と' clone'は、浅いコピーを微妙に違います。 – danivovich

+0

浅い対深いコメントを削除するように修正されました。 –