2020-12-19
ruby/rbsのマージ権限をもらった。といっても一週間ぐらい前の話なのだけど…。
引き続きrbs prototype
周りに手を入れていくつもり。
最近設定して便利だったgitの設定についてブログ記事を書いた。
普段detached HEADで生活しつつコミットを作ってからブランチを命名する、というフローで開発しているので、この設定が役に立っている。 コミットを作るよりも先にブランチ名を考える人には必要なさそう。
書いていて「detached HEADで生活するのはあまり一般的ではないのでは」ということに気がついた。
rbs prototype runtime
で、Class#to_s
が上書きされたクラスをsuper classに持つクラスの出力が壊れていたので直した。
この問題は #526 で全部倒したと思っていたら残っていた。
rbs prototype runtime
がextend
を無視しているのに気がついたのでとりあえずIssueを立てた。soutaroさんがしゅっと実装してくれていた
rbs prototype runtime
でArray
やHash
が現れたときに型引数を埋めるようにした。
ruby-jp slackの #support チャンネルで、「includeは取り消せない?」という話になっていたので取り消してみた。
class Module def uninclude(mod) klass = self mod.prepend Module.new { mod.instance_methods(false).each do |m| original_method = mod.instance_method(m) define_method(m) do |*args, **kwargs, &block| if self.is_a?(klass) orig = original_method.bind(self) if s = orig.super_method s.call(*args, **kwargs, &block) else raise NoMethodError.new("undefined method `#{m}' for #{self}", :m, [*args, **kwargs]) end else super end end end } end end module M2 def foo puts 'M2#foo' end def bar puts 'M2#bar' end end module M1 def foo puts 'M1#foo' end end class C include M1 include M2 end C.new.foo # => M2#foo C.new.bar # => M2#bar class C uninclude M2 end C.new.foo # => M1#foo C.new.bar # => NoMethodError
Module#uninclude
にincludeしたモジュールを渡すと、そのモジュールがincludeしていないことになる。
includeしたモジュールにモジュールをprependして、その中でincludeしたモジュールに生えているメソッドを捕まえてsuper_method
に逃がすようにしている。
メソッド定義より前にoriginal_method
を取得しているのがミソで、これをメソッド本文でしてしまうとinstance_method
が定義したメソッドを返してしまう。
また、bind
してからsuper_method
を呼ぶことで、bind
したオブジェクトのsuper_method
を正しく追える。(bind
しないとこのコードのbar
がうまく動かない)
戦争と法、読み終わった。著者の主張が強くて、かつ人を小馬鹿にするようなところも多くて微妙だった。
日本語
- 袖にする
- 雰囲気でしか知らなかった
- 赫赫(かくかく)
- めっちゃ赤そう
- 欠缺(けんけつ)
- 較差(こうさ)
- 截然(せつぜん)