Skip to content

feat: Sprite#clone → create_clone_of + Array.new 展開 + Hash.new エラー #548

@takaokouji

Description

@takaokouji

Goal

Sprite#clone を Scratch の create_clone_of と紐付けて実装する。ブロックプログラミングに慣れたユーザーが、Ruby のオブジェクト指向(インスタンス生成)を理解する一助とする。

また、Array.new(n, val) のコンストラクタ呼び出しにも対応する。

1. Sprite#clone → create_clone_of

対応表

Ruby Scratch ブロック 備考
self.clone create_clone_of("myself") @ruby:method:clone コメントでラウンドトリップ
Sprite2.clone create_clone_of("Sprite2") 同上
create_clone("myself") create_clone_of("myself") 従来通り使用可能
  • self.clonecreate_clone("myself") はどちらも使える。双方向で OK
  • clone を使った場合はコメントマーカー @ruby:method:clone を付与し、ジェネレーターで self.clone を復元する
  • create_clone で書いた場合は従来通り create_clone("myself") として出力

コンバーター

# self.clone → create_clone_of("myself") + @ruby:method:clone
# Sprite2.clone → create_clone_of("Sprite2") + @ruby:method:clone

self レシーバーの .clone (引数なし) を control_create_clone_of に変換。クラス名レシーバー(Sprite2.clone)にも対応。

ジェネレーター

@ruby:method:clone コメント付き control_create_clone_ofself.clone / Sprite2.clone を出力。コメントなしの場合は従来通り create_clone("myself") を出力。

2. destroy — 対応しない

delete_this_clone の Ruby 的表現(destroy / delete)は命名が未確定のため、現時点では実装しない。delete_this_clone をそのまま使用する。

3. Hash.new(0) — 変換エラー

Hash.new(0) のようなデフォルト値付きハッシュコンストラクタは、現時点では Scratch のデータモデルにマッピングできないため、変換エラーとする。

エラーメッセージ例: Hash.new(0) — ハッシュのデフォルト値には対応していません。{} を使ってください。

Hash.new (引数なし) は {} に変換する。

4. Array.new(n, val) — 配列リテラルに展開

Ruby 変換結果
Array.new []
Array.new(5) [nil, nil, nil, nil, nil] → 空文字列 ["", "", "", "", ""]
Array.new(5, 0) [0, 0, 0, 0, 0]
  • 引数は定数のみ対応(変数引数は ruby_statement にフォールバック)
  • ブロック付き Array.new(5) { |i| i * 2 } は対応外

Implementation Steps

  • Phase 1: self.clone / ClassName.clonecreate_clone_of 変換 + ラウンドトリップ
  • Phase 2: Hash.new (引数なし → {}) / Hash.new(0) (変換エラー)
  • Phase 3: Array.new / Array.new(n, val) の配列リテラル展開
  • Phase 4: ブラウザ確認

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions