仕事のプログラムを,Rubyで書いていたときのことです.
Symbolオブジェクトの配列って,ソートできたっけ…
と思い,端末でpryを実行したものの,なぜかエラーメッセージが出て,pryのなじみのプロンプトになってくれませんでした.
gem updateをしても,変わりません.使用するRubyは,rbenvでインストールしたのですが,rbenv install 2.7.0-devで最新版のビルドをさせるとなると,数分はかかるし,それで解決する保証はないし…
pryにかえて,irbを使うことにしました.irbコマンド実行直後のプロンプトは,こうです.
irb(main):001:0>
[:xyz,:abc].sortを実行すれば,ソートできるか確認できるなあと思いながら,最初の「[」を押した時点で,プロンプトが一部変化しました.
irb(main):001:1* [
「>」から,「*」に変わっています.コマンド,ではなく,Rubyの式を入力中というのを,表しているのでしょうか.もう少し,打っていきます.
irb(main):001:1* [:
irb(main):001:1* [:xyz
irb(main):001:1* [:xyz,
irb(main):001:1* [:xyz,:abc
irb(main):001:0> [:xyz,:abc]
ここで,「*」から「>」に戻りました.Rubyの構文上,正しい式のときには「>」,そうでないときには「*」と表示される,と思われます.
ソートさせましょう.
irb(main):001:0* [:xyz,:abc].
irb(main):001:0> [:xyz,:abc].s
ここでTabキーを2回打つと,候補が出ました.
irb(main):001:0> [:xyz,:abc].s [:xyz,:abc].shift [:xyz,:abc].sort! [:xyz,:abc].sort_by! [:xyz,:abc].select! [:xyz,:abc].shuffle! [:xyz,:abc].shuffle [:xyz,:abc].sample [:xyz,:abc].sort [:xyz,:abc].select [:xyz,:abc].sum [:xyz,:abc].size [:xyz,:abc].slice [:xyz,:abc].slice! [:xyz,:abc].slice_before [:xyz,:abc].slice_after [:xyz,:abc].slice_when [:xyz,:abc].sort_by [:xyz,:abc].singleton_methods [:xyz,:abc].singleton_class [:xyz,:abc].singleton_method [:xyz,:abc].send irb(main):001:0> [:xyz,:abc].s
補完候補はソートされていませんが,ともあれ「sort」が見つかりましたので,o,Tab,Enterの順に押しました.
irb(main):001:0> [:xyz,:abc].sort => [:abc, :xyz]
Symbolオブジェクト間でソートが可能なのを,無事に確認できました.
ちなみに「irb(main):001:0* [:xyz,:abc].」の状態でも,Tabキー2回で候補が出現しました.それと「irb(main):001:0> [:xyz,:abc].s」のときにEnterキーを押すと,「NoMethodError (undefined method `s' for [:xyz, :abc]:Array)」というエラーになりました.これは実行時エラーであり,「[:xyz,:abc].s」はRubyの構文として適切(Array#sを定義していればエラーなく処理してくれる)なのは言うまでもありません.