diary

I like Hatena Star with a text selection.

2020-06-24

github.com

ruremaにIssueを立てた。


www.rubyonrails.link

英語見ると避けてしまう癖をなくすために、英語Slackコミュニティに入ってみた。


bugs.ruby-lang.org

GitHubにPRしていたDelegateClassinstance_methodsの相性が悪い件についてbugsにチケットを作った。


bugs.ruby-lang.org

RubyVM::AST.ofにevalで定義されたメソッドを渡すと何を返すか分からない問題についてチケットを作った。

これの何が不便かと言うと、ofevalで定義されたメソッドが渡ってくるかもしれないという状況が起きるとどうしようもなくなってしまうこと。 ofevalで定義されたメソッドを渡すと何が返ってくるかわからないし、そのメソッドがevalで定義されているかどうかは判断しようがないので、ofが返す値がなにも信じられなくなってしまう。


もうひとつbugsにお手紙書きたいネタがあった気がするけど思い出せない……。だれか知っていたら教えてください。


RailsとBootsnapにそれぞれバグっぽい挙動を見つけたので、整理している。 明日あたりIssueを立てたい。

まずRailsの問題。

$LOAD_PATHにあるのと同じファイル名でrails runnerしようとすると、$LOAD_PATHの方を見に行ってしまう。

$ echo 'p "hello"' > prime.rb
$ bin/rails runner prime.rb # "hello" が表示されず、$LOAD_PATH にある方のprimeがloadされる

https://github.com/rails/rails/blob/34991a6ae2fc68347c01ea7382fa89004159e019/railties/lib/rails/commands/runner/runner_command.rb#L40-L42

このへんのコードが原因。 rails runnerFile.exist?がtrueを返す場合Kernel.#loadを使ってファイルを読み込むのだけど、Kernel.#loadがファイルを読み込む時の優先順序は、$LOAD_PATHを全部なめた後にカレントディレクトリを見る。 そのため、カレントディレクトリにあるファイルと同じ名前のファイルが$LOAD_PATHにあれば、そちらが優先して読み込まれてしまう。

File.exist?でチェックしているものとKernel.#loadで読み込まれるものが違うのはバグと言って良いのではないかなあ。

つぎはBootsnapの問題。

これは単純で、BootsnapはKernel.#loadでファイルを読み込む時に拡張子を勝手に補完してしまう。

# Kernel.#load は拡張子を補完しないので、LoadError
load 'prime'

# これなら読み込まれる
load 'prime.rb'

しかし、Bootsnapが有効な環境だと、load 'prime'LoadErrorにならず通ってしまう。

これは↑のRailsの問題を考えている時に見つけた。

ただ、BootsnapをRailsなしの環境で動かす方法がよく分からなくて、再現手順を作れずにいる。詳しい人がいたら教えてください…。


RBSのSyntax Updateを読んだ。

RBSはPRがマージされている。Steepの方はまだWIPぽい。

HackMD の Class and Module Declaration Syntax Update

https://hackmd.io/BuYUsK9IRLqRehlu6_62gg

  • classの中に色々ネストして書けるようになる
  • オープンクラスができる
  • オープンクラスで既存メソッドをoverloadするにはoverloadキーワードを使う
  • 既存のextension, superはdeprecate
    • superってはじめて知った

Writing library names everytime when writing class/module declaration doesn’t feel great.

これってextension Integer (Matrix)(Matrix)を書きたくない、という意味で合ってるかな

Two class definitions may include definitions of a method.

RBS doesn’t support this. It assumes the conflict is not intentional and will report an error or a warning.

なるほど。 同名のメソッドが複数書かれているとエラーになる。

ruby/rbs#307

https://github.com/ruby/rbs/pull/307

  • extensionはremoved
  • Type name resolutionはRubyのものに近くなったけど、継承までは見ない
  • superはdeprecated (削除はされてない?)
  • incompatibleはdeprecated and ignored
    • これ知らなかった

注目のprototype周りはほとんど変わっていなかった。writerにいくらか差分があって(当然)、そっちで吸収しているかな