0

オブジェクトを取得して、メソッド内で別のオブジェクトを変更しようとしていますが、更新された値が返されません。これは、例によって最もよく説明されています。

@testobject = "This is a string."
handler=Handler.new
handler.load(@testobject)
puts @testobject
=> "This is a string."

ハンドラ.ロード:

def load(@testobject)
  @testobject = @testobject + " Modified!"
end

これはオブジェクトのスコープに関係していると確信していますが、元のオブジェクトを他のクラスからアクセス可能にして変更可能にする方法については困惑しています。

編集:これはおそらく悪い例です。変数/オブジェクトスコープがどのように機能するかを理解するために文字列を使用していますが、実際のプログラムでは文字列ではありません。

具体的には、使用しているオブジェクト (「ストリーム」) があります。次に、プラグインのような「ハンドラ」オブジェクトがあり、それぞれが最初の「ストリーム」オブジェクトを変更する必要があります。ハンドラーごとに、handler.load を呼び出し、適切なメソッドを実行して「ストリーム」オブジェクトの設定を変更します。

4

4 に答える 4

0

@testobjectこれは、パラメータ名として入力したためです。

この行が実行されると:

@testobject = @testobject + " Modified!"

実際のパラメーター名は、インスタンス変数によって隠されます。

ただし、@ を削除しても、変数のローカル コピーにのみ影響します。

String#replace文字列を効果的に更新するために使用できます。

それを試してください:

def load(testobject)
  testobject.replace(testobject + " Modified!")
end
于 2013-03-01T19:52:02.767 に答える
0

メソッドによってのみオブジェクトを変更できます。文字列の場合はreplaceまたはgsubです。配列の場合は、<<メソッドなどです。

ハンドラーの範囲内

@testobject = @testobject + " Modified!" 

@testobject + " Modified!「 Handler のインスタンスのインスタンス変数に割り当てる」という意味@testobjectで、@testobject を変更しません。

ところで、Ruby のバージョンは何をお使いですか?ruby 1.9.3 が解釈できない

def load(@testobject)
  @testobject = @testobject + " Modified!"
end

インスタンス変数を引数としてメソッドを宣言する方法がないためです。

于 2013-03-01T20:20:18.627 に答える
0

メソッドの+結果は新しい文字列になります。@testobject 変数は古いものを参照し続けます。

def load(@testobject)
  @testobject = @testobject << " Modified!"
end

<<@testobject 変数が参照するオブジェクトを変更します。

于 2013-03-01T22:14:09.427 に答える
-1
@testobject = 'This is a string.'
callback = Proc.new {|suffix| @testobject = @testobject + suffix}
handler.load(callback)

def load(callback)
    callback.call(' Modified!')
end
于 2013-03-01T19:55:53.520 に答える