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.clone と create_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_of → self.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
関連
Goal
Sprite#cloneを Scratch のcreate_clone_ofと紐付けて実装する。ブロックプログラミングに慣れたユーザーが、Ruby のオブジェクト指向(インスタンス生成)を理解する一助とする。また、
Array.new(n, val)のコンストラクタ呼び出しにも対応する。1. Sprite#clone → create_clone_of
対応表
self.clonecreate_clone_of("myself")@ruby:method:cloneコメントでラウンドトリップSprite2.clonecreate_clone_of("Sprite2")create_clone("myself")create_clone_of("myself")self.cloneとcreate_clone("myself")はどちらも使える。双方向で OKcloneを使った場合はコメントマーカー@ruby:method:cloneを付与し、ジェネレーターでself.cloneを復元するcreate_cloneで書いた場合は従来通りcreate_clone("myself")として出力コンバーター
selfレシーバーの.clone(引数なし) をcontrol_create_clone_ofに変換。クラス名レシーバー(Sprite2.clone)にも対応。ジェネレーター
@ruby:method:cloneコメント付きcontrol_create_clone_of→self.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) — 配列リテラルに展開
Array.new[]Array.new(5)[nil, nil, nil, nil, nil]→ 空文字列["", "", "", "", ""]Array.new(5, 0)[0, 0, 0, 0, 0]Array.new(5) { |i| i * 2 }は対応外Implementation Steps
self.clone/ClassName.clone→create_clone_of変換 + ラウンドトリップHash.new(引数なし →{}) /Hash.new(0)(変換エラー)Array.new/Array.new(n, val)の配列リテラル展開関連