No.2ベストアンサー
- 回答日時:
インスタンスそのものをnilに変える(?)というのではなく、名前の参照先をnilに変えるということですよね?
となると、その名前を何かしらの手段で入手する必要がありそうですが、どこまでを対象とされているのでしょうか。
また、newメソッド以外にもインスタンスを作成する可能性はありますが、newメソッド経由で作成された物に限るのでしょうか。
仮にグローバル変数かつインスタンス全てということであれば、こういった感じで実現できそうです。
https://ideone.com/Jpphp
(===はクラス判定に限らないことと、kind_of?はサブクラス等も含められる事に気をつけてください)
クラス変数や定数、現在のローカル変数等も同様に実現可能です。
ただ、それで対象のインスタンスすべてがGCによって攫われたのかと言われると、自分にもよくわかりません。
最後にObjectSpace経由で対象のインスタンスが無くなっている事を確認したほうがいいかもしれませんが・・・それでも全ての「組み込みクラスのインスタンス」まで含められるわけではない筈です。
ちなみに、どういった用途を想定されているのでしょうか?
sholmes様
ご回答ありがとうございます。
私が、知りたかった事はそれでした。
>インスタンスそのものをnilに変える(?)というのではなく、名前の参照先をnilに変えるということですよね?
今回の質問では、インスタンスをnilに変えようと思っていました。
その後で、GC.startをしたら、参照先も全部消えてくれるのではないかという予想でした。
もちろん、参照先も分かれば、それはそれで嬉しいです。
>また、newメソッド以外にもインスタンスを作成する可能性はありますが、
>newメソッド経由で作成された物に限るのでしょうか。
すみません、newメソッド以外でインスタンスを作成する方法が
あることを知りませんでしたので、この事は想定外でした。
今回の質問では、new経由で作成された物に限っていました。
式の意味は良く分かりませんでしたが(特にeval)
そのまま書きますと、上手くいきました。
式の意味の流れは、こんな感じだ予想しています。
全てのグローバル変数を見る。
もしそのグローバル変数が、クラスAのインスタンスなら、nilにする。
>それでも全ての「組み込みクラスのインスタンス」まで含められるわけではない筈です。
詳しくはないので間違ってるかもしれませんが、
もしかしたら、今問題にしていたのは、
組み込みクラスのインスタンスかもしれません。
>ちなみに、どういった用途を想定されているのでしょうか?
RPGツクールVXというゲーム作成ソフトに
Spriteというクラス(恐らくRPGツクール独自の組み込みクラス)
があるのですが、それを使って表示された画像を
一旦全部消したかったのです。
今回の質問は、解決できましたので
その用途については、ゆっくり調べて行きたいと思います。
お忙しい中、ありがとうございました。
今後とも宜しくお願い致します。
No.3
- 回答日時:
>A.newで作られた物全てをnilにしたいのですが
そんなことをしたいと思ったこと自体が間違っている可能性がありますね。
普通はそんなことはしません。
なぜそんなことを思ったのでしょうか?
notnot様
ご回答ありがとうございます。
>そんなことをしたいと思ったこと自体が間違っている可能性がありますね。
その可能性は、かなりあると思います。
>なぜそんなことを思ったのでしょうか?
この掲示板と少し話題が外れてしまうようで心苦しいのですが
やりたい事の大筋は、前述の通りなのですが
もう少し深く掘り下げますと
ゲームにあらかじめ用意されているスクリプトと
他人の作ったスクリプトを利用している為
スクリプトに詳しくない私には、
他人が作ったスクリプトで表示している画像を消す事が出来ませんでした。
クラスAでSprite.newして作った画像を
クラスBから消す必要があったのですが
どちらのクラスも、別々のクラスを継承しているため
継承する事によって、別のインスタンスを参照し、nilにすることは諦めました
(出来るのかも知れませんが無理でした)
次に試したのが、クラスメソッドです。
クラスメソッドを使って、クラスBからクラスAのメソッドを使う事はできたのですが
クラスAの変数を利用することはできませんでした。
その為、変数をグローバル変数して、クラスBからクラスAの変数を使える様にしました。
しかし、何故か、グローバル変数にしたにも関わらず、クラスA内でSprite.newした画像を
クラスBから、全て消す事が出来なかったのです。
消えるときもありますし、時間がたってから消える事もあります。
とにかく、訳がわからないので、全部消したらどうなるか?
という事をやってみたかったのです。
お忙しい中、ありがとうございました。
今後とも宜しくお願い致します。
No.1
- 回答日時:
まず定義した変数名を調べます。
グローバル変数だと
global_variables
で定義されている変数名が得られます。ところが最初からシステムで定義されているものが多くありますので、それを取り除く必要があります。
ところで、グローバル変数である必要があるのでしょうか?
特に理由がないのでしたら、ローカル変数(変数名が小文字の英文字から始まる)にしましょう。
ローカル変数名は
local_variables
で得られます。初めて気がついたのですが"_"が最初から定義されているのですね。(これは何に使うのだろう??)
local_variables-["_"]で定義された変数名を取得できます。
もっと簡単そうなのは配列に入れることです。例えば
a[0]=A.new
a[1]=A.new
とかの様に
そうすると
a=a.collect{|v| A===v ? nil : v}
で可能です。
またローカル変数の場合は
(local_variables-["_"]).each{|v|
if A===eval(v)
eval(v+"=nil")
end
}
こんな感じでしょうか
ki073様
ご回答ありがとうございます。
>ところで、グローバル変数である必要があるのでしょうか?
今直面している問題と条件が同じですので
グローバル変数であった方が望ましいです。
global_variablesは便利ですね。
初めて知りました。
今後、何かに使えそうです。
教えて頂いた方法は、自分で把握している物を
あとから消しているので、
少し私の意図してることとは違いましたが
この方法も、便利ですね。
式の意味は良く分かりませんでしたが
その通りに書くと、消す事ができました。
お忙しい中、ありがとうございました。
今後とも宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Perl perlについて 2 2022/11/18 19:38
- 英語 難解な英文 2 2023/07/28 22:24
- 英語 I hope will ・・・・・・ 2 2022/07/24 09:48
- ノートパソコン 【至急】質問です。ノートパソコンを購入しようとしています。 5 2023/02/08 07:31
- 中学校 Do you want a new bag? Want you a new bag? この二つの違い 3 2022/07/30 15:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビーリアルのユーザー名を変え...
-
100万件越えCSVから条件を満た...
-
パソコンのスクリーンセーバー...
-
(再質問)エクセルのマクロボ...
-
C言語の入力した文字を反転させ...
-
VBA
-
三項でたとえば交換って
-
英数字を含む文字列(0-9,A-Z)...
-
7セグメント LED ディスプレイ ...
-
Ruby on railsをrails sで立ち...
-
WinSCPで画像のように puttyを...
-
pandasでsqlite3にテーブル作成...
-
1、Rstudioで回帰直線を求める...
-
【メモリ不足で落ちる(python)】
-
パイソンのクラス
-
電子書籍epub変換について
-
VBA メモ帳の上書き保存がしたい
-
Accessで文字列のバイト数読み込み
-
実行時エラー450:引数の数が一...
-
このCをDに変える方法を教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どういうプログラムで組みます...
-
関数の引数に複数のユーザ定義...
-
別のクラスのインスタンスの作り方
-
get() と find() の違いについて
-
パイソンのクラス
-
「arg」は何の略?
-
No route matches [GET] "/post...
-
A1の値をファイル名に指定した...
-
エクセルVBA オートフィルタで...
-
Rubyについて質問です
-
エラー「メソッドまたはデータ...
-
VBAで型が一致しないエラー(バ...
-
教えてください。vb5.0
-
Csvファイルの最終行を取得する...
-
クラス名やモジュール名の競合...
-
HSTLやSSTL等のI/Oピン
-
10円未満を切り捨てる方法は?
-
What class are you in? には何...
-
try ~ catch構文が使えない
-
【BrowseForFolderでデスクトッ...
おすすめ情報