ruremaにIssueを立てた。
英語見ると避けてしまう癖をなくすために、英語Slackコミュニティに入ってみた。
GitHubにPRしていたDelegateClass
とinstance_methods
の相性が悪い件についてbugsにチケットを作った。
RubyVM::AST.of
にevalで定義されたメソッドを渡すと何を返すか分からない問題についてチケットを作った。
これの何が不便かと言うと、of
にeval
で定義されたメソッドが渡ってくるかもしれないという状況が起きるとどうしようもなくなってしまうこと。
of
にeval
で定義されたメソッドを渡すと何が返ってくるかわからないし、そのメソッドが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される
このへんのコードが原因。
rails runner
はFile.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を読んだ。
- https://hackmd.io/BuYUsK9IRLqRehlu6_62gg
- https://github.com/ruby/rbs/pull/307
- https://github.com/soutaro/steep/pull/157
RBSはPRがマージされている。Steepの方はまだWIPぽい。
HackMD の Class and Module Declaration Syntax Update
https://hackmd.io/BuYUsK9IRLqRehlu6_62gg
- classの中に色々ネストして書けるようになる
- オープンクラスができる
- オープンクラスで既存メソッドをoverloadするには
overload
キーワードを使う - 既存の
extension
,super
はdeprecatesuper
ってはじめて知った
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にいくらか差分があって(当然)、そっちで吸収しているかな