rails console
などでirbやpryといったREPL(Read-Eval-Print-Loop)を多用する開発をしていると、終いにはプログラムをそこに貼り付けて評価したくなるものです。しかし、REPLは、改行付きメソッドチェーンを上手く評価してくれないという問題があります。
関連して、Rubyでメソッドチェーンを改行して書くとき、ドットを行末に書くか、それとも行頭に書くかという議論がときどきありますが1、ドットを行末に書きたいメインの理由が「REPLに貼り付けたいから」だったりします。
とは言え、そのためだけにコーディングルールを変更したくもないわけで、ここでは、REPL側で解決するための二つの方法と、そのための設定を書きます。
方法1:一つの式にしてしまう
REPLが1行ごとに評価されるのは仕方がないので、一つの式にしてしまいましょう。ちなみにRubyはクラスやメソッド定義も式として扱ってくれるので、基本的に何も考えず()
で囲むだけで十分です。
irb(main):001:0> (
irb(main):002:1* '1'
irb(main):003:1> .to_i
irb(main):004:1> )
=> 1
ただ、pryでメソッドチェーンを正しく認識してもらうにはもうひとつ障害があって、ドットから始めるとシェルコマンドを叩くコマンドとして認識されてしまいます。
[1] pry(main)> (
[1] pry(main)* '1'
[1] pry(main)* .to_i
Error: there was a problem executing system command: to_i
このコマンドはコマンドライン操作も含めてRubyでやろうという素敵な機能ですが、メソッドチェーンの方が大事なので外します2。以下のコードを~/.pryrc
などに書きましょう。
Pry.commands.delete '.<shell command>'
方法2:pasteboardの中身を直接評価する
基本的にMacでローカルでサーバー立てて開発してるというのであれば、pasteboardを直接評価してしまうコマンドを追加するという方法があります。適当にエディタで書いたプログラムをサクッと評価できるので地味に便利。
Pry.commands.delete '.<shell command>'
Pry.commands.block_command (/^.$/), "Evaluate string of `pbpaste`", keep_retval: true do
string = `pbpaste`
puts Pry::Helpers::BaseHelpers.colorize_code(string)
target.eval string
end
# [1] pry(main)> .
# 1
# .to_i
# => 1
以上です。
-
https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains ↩
-
同じ思想のものとして Emacs Lisp で書かれた eshell などがあります。 ↩