diary

I like Hatena Star with a text selection.

2020-12-19

ruby/rbsのマージ権限をもらった。といっても一週間ぐらい前の話なのだけど…。 引き続きrbs prototype周りに手を入れていくつもり。


pocke.hatenablog.com

最近設定して便利だったgitの設定についてブログ記事を書いた。

普段detached HEADで生活しつつコミットを作ってからブランチを命名する、というフローで開発しているので、この設定が役に立っている。 コミットを作るよりも先にブランチ名を考える人には必要なさそう。

書いていて「detached HEADで生活するのはあまり一般的ではないのでは」ということに気がついた。


github.com

rbs prototype runtimeで、Class#to_sが上書きされたクラスをsuper classに持つクラスの出力が壊れていたので直した。 この問題は #526 で全部倒したと思っていたら残っていた。


github.com

rbs prototype runtimeextendを無視しているのに気がついたのでとりあえずIssueを立てた。soutaroさんがしゅっと実装してくれていた


github.com

rbs prototype runtimeArrayHashが現れたときに型引数を埋めるようにした。


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がうまく動かない)


戦争と法 (文春e-book)

戦争と法 (文春e-book)

戦争と法、読み終わった。著者の主張が強くて、かつ人を小馬鹿にするようなところも多くて微妙だった。


日本語

  • 袖にする
    • 雰囲気でしか知らなかった
  • 赫赫(かくかく)
    • めっちゃ赤そう
  • 欠缺(けんけつ)
  • 較差(こうさ)
  • 截然(せつぜん)