定期ミートアップ 第24回
用途
Enumerable
RustでいうとIteratorにちかい
ただ、RustのfilterはIteratorを返すがRubyのArray#selectはArrayを返す
ストリームとして扱いたいときはary.lazy.selectのようにする
Comparable
requirements: == と >
たとえばArray#sortの型に使いたい
RustだとEq, PartialEq, Ord, PartialOrdの4つに分かれている
floatは x = NaN のとき x == x が成り立たない→PartialEqだがEqではない
floatは x = NaN のとき x < y が未定義になる→PartialOrdだがOrdではない
記法をどうするかの問題がありそう
Rustはwhereで書ける
code:sk
class Array<T: Comparable>
def sort -> Array<T>
他の言語はどうしてるんだろう
あと、RustでいうSelfがないとclass Int : Comparable<Int>みたいにするはめになる
String
ShiikaはいまのところStringクラス(immutable)とMutableStringクラス(mutable)を分けている
substringみたいな操作は両方のクラスにあってほしい
→ StringをMutableStringの親クラスにすればよい?
実はそうではない
継承してしまうと、Stringをとる関数にMutableStringのインスタンスを渡せてしまう
その関数は、受け取ったStringをどこかに保存するかもしれない
そして、そのStringが変化しないことを前提にしているかもしれない
immutableな操作をModuleに切り出す
code:sk
module StringOps
def substring(from: Int, len: Int) -> String
...
end
end
class String : StringOps
class MutableString : StringOps
Default
Rustのトレイト
Goのゼロ値みたいなもの
Defaultを実装しておくと、Default::default()と書くだけで適当に値を作ってくれる(型推論のおかげ)
code:sk
class Meta:Array<T> : Default #?? a = Array.default()
Shiikaでやるとしたらメタクラスにモジュールをincludeする手段が必要そう