Goal
attr_accessor、attr_reader、attr_writer をサポートし、インスタンス変数のアクセサメソッド経由での読み書きをブロックに変換できるようにする。
Background
TryRuby レッスン 470 で attr_accessor が使われている。スモウルビーではインスタンス変数 (@foo) は Scratch 変数として既にサポートされているが、attr_accessor による getter/setter メソッド構文(foo, self.foo, self.foo = val)は未対応。
Ruby の仕様
| メソッド |
効果 |
attr_accessor :foo |
getter (foo / self.foo) + setter (self.foo = val) |
attr_reader :foo |
getter のみ |
attr_writer :foo |
setter のみ |
| 複数指定 |
attr_accessor :hp, :name で複数同時定義 |
ブロック変換
class Sprite1 < Sprite
attr_accessor :hp, :name
when_flag_clicked do
self.hp = 100 # → data_setvariableto(@hp, 100)
self.name = "hero" # → data_setvariableto(@name, "hero")
say(hp) # → looks_say(@hp) ← @hp の data_variable
say(self.name) # → looks_say(@name)
end
end
Implementation Steps
Phase 1: コンバーター — attr_accessor/reader/writer の解析
Phase 2: コンバーター — getter/setter の変換
Phase 3: ジェネレーター — ラウンドトリップ
Phase 4: ブラウザ確認
Definition of Done
Affected Files
packages/scratch-gui/src/lib/ruby-to-blocks-converter/class-visitor.js — attr_accessor 解析
packages/scratch-gui/src/lib/ruby-to-blocks-converter/ast-handlers/expressions.js — getter 変換
packages/scratch-gui/src/lib/ruby-to-blocks-converter/ast-handlers/assignments.js — setter 変換
packages/scratch-gui/src/lib/ruby-generator/class-wrapper.js — attr_accessor 出力
packages/scratch-gui/src/lib/ruby-generator/data.js — アクセサ変数の出力変換
packages/scratch-gui/test/unit/lib/ruby-roundtrip/ — テスト追加
Risks & Open Questions
attr_reader で setter を使った場合の挙動: エラーにするか ruby_statement にフォールバックするか → フォールバックが安全
- ジェネレーター側で
@foo を foo に変換する際、アクセサ情報をどこに保持するか → コメントマーカーで管理
Goal
attr_accessor、attr_reader、attr_writerをサポートし、インスタンス変数のアクセサメソッド経由での読み書きをブロックに変換できるようにする。Background
TryRuby レッスン 470 で
attr_accessorが使われている。スモウルビーではインスタンス変数 (@foo) は Scratch 変数として既にサポートされているが、attr_accessorによる getter/setter メソッド構文(foo,self.foo,self.foo = val)は未対応。Ruby の仕様
attr_accessor :foofoo/self.foo) + setter (self.foo = val)attr_reader :fooattr_writer :fooattr_accessor :hp, :nameで複数同時定義ブロック変換
Implementation Steps
Phase 1: コンバーター — attr_accessor/reader/writer の解析
class-visitor.jsでクラス本体トップレベルのattr_accessor :foo, :barを認識@foo,@barを作成@ruby:attr_accessor:foo/@ruby:attr_reader:foo/@ruby:attr_writer:fooコメントをマーカーブロックに付与(ラウンドトリップ用)Phase 2: コンバーター — getter/setter の変換
foo(レシーバーなし CallNode、クラス内) → アクセサ登録済みなら@foo変数参照に変換self.foo→ 同上self.foo = val(CallOperatorWriteNode or LocalVariableWriteNode) →@foo = val変数代入に変換Phase 3: ジェネレーター — ラウンドトリップ
@ruby:attr_accessor:fooコメント付き変数定義 →attr_accessor :fooを出力@foo読み取り →fooとして出力(アクセサ登録済みの場合)@foo = val書き込み →self.foo = valとして出力(アクセサ登録済みの場合)attr_accessor :hp, :nameにまとめるPhase 4: ブラウザ確認
Definition of Done
attr_accessor :hp+self.hp = 100+say(hp)のラウンドトリップattr_reader :nameで setter (self.name = "x") がエラーにならない(ruby_statement にフォールバック)attr_accessor :hp, :nameのラウンドトリップAffected Files
packages/scratch-gui/src/lib/ruby-to-blocks-converter/class-visitor.js— attr_accessor 解析packages/scratch-gui/src/lib/ruby-to-blocks-converter/ast-handlers/expressions.js— getter 変換packages/scratch-gui/src/lib/ruby-to-blocks-converter/ast-handlers/assignments.js— setter 変換packages/scratch-gui/src/lib/ruby-generator/class-wrapper.js— attr_accessor 出力packages/scratch-gui/src/lib/ruby-generator/data.js— アクセサ変数の出力変換packages/scratch-gui/test/unit/lib/ruby-roundtrip/— テスト追加Risks & Open Questions
attr_readerで setter を使った場合の挙動: エラーにするか ruby_statement にフォールバックするか → フォールバックが安全@fooをfooに変換する際、アクセサ情報をどこに保持するか → コメントマーカーで管理