初学者(とその指導を行う人)向けRubyとIDE

RubyでもIDEの支援がほしい

もう長いこと Ruby を書いているが、Ruby は初学者に優しくない言語だなと思うことは多々ある。

Ruby の考え方、動作はあくまで言語のユーザーから見た場合はかなりシンプルで、知らないと驚くことは多少あっても分かってしまえばいちいち細かい動作に戸惑うようなことは多くない。少なくとも動的型と呼ばれる言語の中ではオブジェクトの振る舞い、真偽の判定などについてはかなりカタイ動作をするので、十分に分かりやすいと思う。1

一方で、

  1. 伝統的には標準的なスタイルガイドと呼べるものがなく、Rubocop 登場以降はその設定の話題が多く、バイク小屋議論になりがち2
  2. 型を明示する記法に RDoc, YARD などはあったが、この活用もバラツキが大きい3

という状況が続いていた。つまり、

  1. ある程度 Ruby に馴染みのある人は「フツーそこでそんな書き方しないよね、でも確かにそう書いても問題ないのでレビューが手間」
  2. 静的型の人を含む Ruby 初学者は「このオブジェクトが何者か分からない」

という悩みを抱えがちになっていた。

ということで今回はひとまず VS Code を利用している Ruby 初学者向けの拡張とその設定を紹介し、これらの課題を解決する方法を示す。

なお、VS Code 拡張の紹介という形にはなっているが、その実装は独立したコマンドと LSP ( Language Server Protocol ) を基本としているため、やろうと思えば同じことは別な IDE やエディタでも実現できるものを選んでいる。もしかしたら VS Code に限定した場合はもっと手軽でよいものがあるかもしれないが、そこはあえて限定していないということでご容赦いただきたい。

単純な記法はStandard gemで

これは以前も

Standard gemを試してみた (2022-06-05) | あーありがち

に書いたが、これを VS Code 上で実現するためには

Ruby - Visual Studio Marketplace

を利用する。

Lint の settings を開くと Lint の項目で linter が選べるので standard を true にするだけ。settings.json の中に下のような記述があればオーケー。

    "ruby.lint": {
      "standard": true
    },

これで Standard に従って警告してくれる。

Standard gem は最近では bundle gem で skelton を生成した際にもデフォルトで適用されるくらいには認知度が上がっているらしく、もう堂々とこれでいきますと言ってよいと思う。

型情報は現状ではSolargraphがお手軽

Solargraph についても以前書いたが、

今さらYARD + Solargraphで快適Rubyコーディング (2022-06-04) | あーありがち

これを VS Code 上で実現するには以下の拡張を利用する。

Ruby Solargraph - Visual Studio Marketplace

YARD 記法に従って書かれたコメントをもとに他の言語と同じように type などのヒント情報がポップアップされるのはなかなかに感動的だ。

残りの設定は bundler を使うかどうかくらいだと思う。Use Bundler にチェックを入れる場合は Bundler Path も正しく設定しないといけないかもしれない。bundler で project local に入れた Solargraph を利用するかしないかは使い方次第ではあるが、依存 gem のドキュメントも生成してくれたりと便利な機能もあるので使っていった方がよさそうに見える。

LintingをSolargraph拡張に寄せる場合は注意が必要

Ruby の Linting は Solargraph 拡張の方に寄せることもできる。

Diagnotsics を true にすると Solargraph 側の Lint が機能するが、その場合、素の Rubocop が動作してしまう。素の Rubocop も Solargraph の Diagnotsics も利用しないと決まっているならよいが、複数のプロジェクトを行き来している間にこの辺りの統制が取れなくなる可能性は十分ある。

その場合はプロジェクトに .rubocop.yml を置いて

GitHub - testdouble/standard: 🌟 Ruby Style Guide, with linter & automatic code fixer

require: standard

inherit_gem:
  standard: config/base.yml

としてあげると Rubocop を叩いても Standard として動作するので、Linting はすべて Standard ですという場合はこれを問答無用で置いておくと安全。

  1. 主に JavaScript, PHP と比べた場合 

  2. JavaScript の ESLint にも似たような時代はあった。なお、個人的には https://shugo.net/ruby-codeconv/codeconv.html に概ね従いつつ、そもそも Emacs 使いなので ruby-mode がご機嫌斜めにならないようにしていくだけでだいたい整うので困らなかった。 

  3. 一部の IDE は独自にインテリジェントな振る舞いをするが、全員がそれを使っているわけではない、という場合に困る 

More