定期ミートアップ 第22回
#Shiika Module
ClassはModuleか
RubyではClassはModuleの一種ということになっている
メソッドを束ねたもの、というような共通点がある
あとは、名前空間として使えるとか
クラスはインスタンスを作成でき、モジュールはできない
これをRustでモデリングしようと思ったら困った
code:rust
struct SkModule {
fullname: ...,
class_info: Option<ClassInfo>
}
struct ClassInfo {
// クラス固有の情報
}
code:sk
module Enumerable<T>
requirement each(f: Fn1<T, Void>)
def all?(f: Fn1<T, Bool>) -> Bool
# eachを使った定義
end
end
モジュールはMethod requirementを持つが、クラスは持たない
「Class behaves as Module」は偽だなあ
Rubyでもinclude(klass)はエラー
yhara (Yutaka HARA)さんはTwitterを使っています: 「@yukihiro_matz ClassがModuleのサブクラスなのって、参考にした言語はありますか? 一般にfoo(Parent.new)ができるならfoo(Child.new)もできてほしいですが、そういえばinclude(klass)はエラーになるなって。」 / Twitter https://twitter.com/yhara/status/1512302041409880065
Yukihiro MatzmottoさんはTwitterを使っています: 「@yhara CLOSやFlavorsではMixinは(制限された)クラスなのでクラスとの継承関係があるのかなと思ってのことで、前例はないですね。Mixin専用の構造を作ったのも独自です。SmalltalkやSelfのTraitの方が早かったようですが、それについては当時知りませんでした。」 / Twitter https://twitter.com/yukihiro_matz/status/1512365887462191105
特に参考にした言語があるわけではないとのこと
ということで
ブランチごと捨てて書き直すことに
Rustで継承したいときはどうする? - yhara.jp
ゲームの話がしたかったわけではない
こうなりました
https://github.com/shiika-lang/shiika/blob/a04ce9b6addaa12a7f03c11b26583fe72d2a3bb8/lib/skc_hir/src/sk_type.rs
おまけ
traitの話
traitっぽいものたち
シェルリのtrait/Squeakのtrait/PHPのtrait
Pythonのmixin/Rubyのmodule
Haskellの型クラス
Scalaのtrait/Rustのtrait
/yubrot/型クラスとimplicit_parameter
大きな違い:メソッドが被ったときにどうするか
定義時に明示的に指定
シェルリのtrait/Squeakのtrait/PHPのtrait
順番で制御
Pythonのmixin/Rubyのmodule
「どっちとして使うか」を指定
Rustのtrait
#定期ミートアップ