メインメニュー
検索
ログイン
ユーザ名:

パスワード:


パスワードを忘れた

新規登録
Squeak関連書籍
Smalltalk関連書籍
メイン
   Squeakプログラミング
     Compiler evaluate: ' クラス変数 := 初期値 '
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
saiki
投稿日時: 2007-4-6 16:13
新米
登録日: 2007-4-6
居住地:
投稿: 15
Compiler evaluate: ' クラス変数 := 初期値 '
教えてください

Compiler evaluate: ' クラス変数 := 初期値 '

結果は (クラス変数 is Undeclared) となります

どうしたら初期化できるでしょうか教えてください

以上 よろしくお願いします


:-(
sumim
投稿日時: 2007-4-7 0:01
新米
登録日: 2004-11-29
居住地:
投稿: 5
Re: Compiler evaluate: ' クラス変数 := 初期値 '
お使いの Smalltalk システムはどんなものですか?

Compiler evaluate: 'Smalltalk version'

という式を print it した結果をお知らせください。
saiki
投稿日時: 2007-4-9 14:18
新米
登録日: 2007-4-6
居住地:
投稿: 15
Re: Compiler evaluate: ' クラス変数 := 初期値 '
連絡します

バージョンを連絡します
Compiler evaluate: 'Smalltalk version'
'Squeakland 3.8-05'

注:クラス変数は複数のパラメータで合成してストリング扱いに設定しています

以上 よろしくお願いします
umejava
投稿日時: 2007-4-10 10:47
新米
登録日: 2004-11-29
居住地:
投稿: 5
Re: Compiler evaluate: ' クラス変数 := 初期値 '
Compiler evaluate: 'Smalltalkの式'

ですが、Squeakの場合はUndefinedObjectにDoItというメソッドを一時的に定義して、実行し、すかさず削除するという方法で実装されています。

したがって、

Compiler evaluate: 'クラス変数 := 初期値'

を行った場合、UndefinedObjectにクラス変数があらかじめ定義されていないといけないことになります。

原則Compiler evaluate:は、グローバルスコープ上で式を実行していると考えるべきでしょう。

クラス変数をCompiler evaluate:で外部から初期化したいのであれば、通常は該当のクラスにinitializeメソッドやセットメソッドを定義して

Compiler evaluate: 'YourClass initialize'.
Compiler evaluate: 'YourClass setClassVarValue: 1'.

などとするのではないかと思います。



sumim
投稿日時: 2007-4-10 13:07
新米
登録日: 2004-11-29
居住地:
投稿: 5
Re: Compiler evaluate: ' クラス変数 := 初期値 '
> クラス変数は複数のパラメータで合成してストリング扱い

つまり、クラス変数を動的に生成してアクセスしたい…ということで合っていますか? umejava さんに倣って、すでに YourClass を定義されているという前提で…


まず、クラス変数「YourClassVar」をシステムブラウザを介さずに(動的に?)定義するには、次の式を使います。

YourClass addClassVarName: 'YourClassVar'

これで、YourClass とそのインスタンスたち(加えて YourClass のサブクラスとそのインスタンスたち)で YourClassVar を共有できます。


しかし、umejava さんも言及されているとおり、Compiler evaluate: 'YourClassVar := #initialValue' では nil のクラスである UndefinedObject に #DoIt というメソッドをアドホックに定義してこれをコールすることで文字列として与えられた式を評価するしくみなため、このままでは UndefinedObject とは縁もゆかりもないクラスである YourClass の YourClassVar にはアクセスできません。

そこで、クラスを指定できる Compiler >> #evalueate:in:to: か、Utilities class >> #evaluate:in:to: を使うというのではいかがでしょうか?

Compiler new evaluate: 'YourClassVar := #initialValue' in: nil to: YourClass

または

Utilities evaluate: 'YourClassVar := #initialValue' in: nil to: YourClass



余談ですが、クラス変数の実体は、それが属するクラスのクラスインスタンス変数(オブジェクトとしてのクラスが有するインスンタス変数。Smalltalk ではクラスもオブジェクトです。念為)である「classPool」に関連づけされている辞書に含まれるので、コンパイラを介さず(eval せず)とも次のように直接、アクセスする方法もあります。

YourClass classPool at: 'YourClassVar' asSymbol put: #initialValue
saiki
投稿日時: 2007-4-10 14:13
新米
登録日: 2007-4-6
居住地:
投稿: 15
Re: Compiler evaluate: ' クラス変数 := 初期値 '
大変ありがとうございます

クラス変数を動的に生成してアクセスしたい…ということが目的です

Compiler new evaluate: 'YourClassVar := #initialValue' in: nil to: YourClass を使用することでアクセスすることができました

以上 
saiki
投稿日時: 2007-4-10 14:22
新米
登録日: 2007-4-6
居住地:
投稿: 15
Re: Compiler evaluate: ' クラス変数 := 初期値 '
ありがとうございます

ご指摘の通り初期化について、initializeメソッドで行う方法も検討したいと思います

特にクラスの構成とデータの構成が悪いように感じていますので見直したいと思いますが、参考になるような事項があれば教えてください

以上
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Google
新着リンク