私は配列["moniker", @moniker]
を持っています。モニカは約100個のインスタンス変数とその文字列表現のいずれかです。私は、インデックス1にあるインスタンス変数が参照しているもの(そのデータ自体ではなく、非常に不変である可能性がある)を変更したい。 array[1] = newData
を実行するだけでは、配列内のwhatsが変更されるため、機能しません。私はこれがC言語では単純だと知っていますが、私はRubyでこれを行う方法を見つけるのに苦労しています。配列内のRubyインスタンス変数を動的に変更します
答えて
あなたの闘争は、あなたがunderlyinにアクセスできるCプログラマーのように思っているからですgポインタ、そしてすべてが変更可能な場所。 Cでは、配列には変更可能な整数へのポインタが格納され、必要に応じて整数を変更できます。 Rubyでは、すべての変数はオブジェクトへの参照であり、との数字は不変オブジェクトです。したがって、@monikerはオブジェクトへの参照で、整数はです。配列を作成すると、その参照が配列にコピーされるので、整数には、@monikerからのものと配列からのものという2つの参照があります。見つけたように、配列内の参照を変更しても、@ monikerという名前の参照は変更されません。オブジェクトはまだです。
「ボックス」配列
参照これは本当に物事のRubyの方法ではありません。 Rubyがどのように参照で動作するかを説明するのに役立つかもしれないので、私はそれを示しています。
あなたは、アレイ内の参照をボックスすることができます
@moniker = [4]
a = ["moniker", @moniker]
これは、あなたが基礎となるオブジェクトにアクセスしたいとき、配列を欽慕する必要があります:
@moniker.first
a[1].first
をしかし、今あなたが根本的に変更することができます@monikerに整数があり、配列に変更が表示されます。
@moniker[0] = 42
p a[1].first # => 42
エンカプセラe可変オブジェクト内の数値。
オブジェクト指向言語であるため、その数値を可変オブジェクトにカプセル化することができます。
class Moniker
attr_accessor :value
def initialize(value)
@value = value
end
end
(attr_accessor :value
は、インスタンス変数@value
用リーダライタ方法をビルド)。
@moniker = Moniker.new(4)
a = ["monikier", @moniker]
@moniker.value = 42
p a[1].value # => 42
明らかに、「値」よりも優れた名前を選択しました。私は値が何を表しているのかわからないのでできませんでした。
これら二つの解決策は、これは、イェルクWミッタークによってコメントだった
動作しますが、それは答えの一部であることを値する理由:
それは明白に見えるかもしれませんが、私は明示的に言及したかったです:2つのソリューションは同じソリューションです。最初のクラスは既存のクラスを汎用のセマンティクスで使用し、2番目のクラスは特定のカプセル化された値に対して正確なセマンティクスを持つ新しいクラスを定義します。しかしどちらの場合も、不変の値を変更可能な値にラップし、「外側の」値を変更することです。
@moniker @monikerは決して配列に入りませんでしたが、その価値はありませんでした。 IRBでは
:
@moniker = 4
a = ["moniker", @moniker]
=> ["moniker", 4]
あなたはちょうどそれを変更するので、とにかく配列の値で作業しているし、あなたが行ってもいいです:
a[1] = 5
a
=> ["moniker", 5]
あなたは検討する必要がありますハッシュ:
h = {:moniker => @moniker}
=> {:moniker=>4}
h[:moniker] = 5
h
=> {:moniker=>5}
- 1. ビュー内のRuby-on-Rails変数を動的に変更する
- 2. Rubyのメタプログラミング:動的なインスタンス変数名
- 3. 配列内のインスタンス変数へのアクセス
- 4. 変数に動的配列を配置
- 5. 配列のテキストの色を動的に変更します
- 6. メインクラスまたはメインメソッド内のインスタンス変数を変更します
- 7. Ruby他のメソッドからインスタンス変数を変更するには?
- 8. Rubyの動的変数名
- 9. Vueインスタンス内の変数を変更しますか?
- 10. 配列内で変数を動的に更新するために変数を渡す - Vue.jsで
- 11. 配列内の動的チェックボックスを変更してmysqlデータベースを更新する
- 12. 自動的に配列に変数を追加しますか?
- 13. 動的配列のサイズ変更
- 14. JavaScriptでページ内のLESS変数を動的に変更する
- 15. 配列名に動的変数を追加しますか?
- 16. Rubyのクラス変数インスタンス変数
- 17. インスタンス変数を使用せずにメソッドループ内の変数にアクセスするruby
- 18. luaは関数内の配列を変更します
- 19. 自動的にインスタンス層を変更します。
- 20. 変数をRubyの配列に分割します
- 21. は自動的にbashスクリプト内の変数を変更
- 22. 配列内のオブジェクトのインスタンス変数を返す方法
- 23. Java:オブジェクトのインスタンス内の変数による配列の検索
- 24. Rubyインスタンス変数へのアクセス
- 25. Rubyのインスタンス変数nil
- 26. 配列内のunix時間変数を変更する
- 27. 配列は2つの異なる値と等しく、変数を動的に変更します
- 28. 文字列内の動的変数
- 29. 単一インスタンス内の静的変数の値を変更する(Java)
- 30. Rubyのインスタンス変数にアクセスする
これは非常に興味深い質問です。それを聞いていただきありがとうございます。 –