最近ちょっとバタバタしていてあまりプライベートに時間を割けませんでしたが、連休に台風接近が重なった事もあり、連休初日だけ出社して残りの二日はお休みを頂きました。ということで、メモ変わりにここのところの事を書き止めておきます。
mruby の public/private について
mrubyではpublic/privateキーワードを言語仕様上で制約しているらしいです。この辺の実装を調べていた時に、Matzさんご本人から教えていただきました。
@dyama226 mrubyにはpublic/privateはありません(機能制限)。CRubyでもsend使うと呼べちゃうんで、あまり効果的な保護ではないんですが。
— Yukihiro Matsumoto (@yukihiro_matz)
自分のつぶやきにもあるように、mruby-sirenでShapeクラスのインスタンスをスクリプトサイドから作らせたくなかったので、initializeをprivateにしようとしたんですが、なかなか見付からず…
よくよく調べてみると、既にそういう話が出てきていました。
there a way to create private methods? #1357
機能制限されている詳細な経緯は分からないけれど、コンパクトで軽量なmrubyの方針においてpublic/privateは利用者側の運用に任せても特に差し支えない機能のはずだから入っていないのかもしれません。(間違ってたらご指摘をお願いします…!)
ちなみにmruby-sirenのShapeクラスは、initializeをスクリプト側から呼んだら例外を吐くようにしています。
mirb - Embeddable Interactive Ruby Shell
> s = Shape.new
(mirb):1: private method `new' called for Shape:Class (NoMethodError)
>
実装はそのままこんな感じです。