ruby-anythingとpry-pipelineで快適コードリーディングかもな話(on pry)
$
ここで出てくる $
っていうのは pry> $ Pry.run_command
とかってやるとPry.run_commandのソースを表示するpryのコマンドです。
ruby-anything
rubyの配列からanything風のインターフェースで一個要素選択するみたいなやつ。Kernel
に_anything_
ってメソッド生えてて_anything_ Pry.methods
とかって使う。 Enumerable
とかにしてPry.methods._anything_
みたいな感じにすれば良かった気はする。
pry-pipeline
pryの $ とか ? ってコマンドを良く使う。でもそれに変数とかメソッドの戻り値を渡したいみたいな時があって、それをデフォルトでうまくやる方法ないと思う。そんな時に使えるものとして作ったのがこれ。
String
とSymbol
に_pipe_(aliased to |)
が生えてる。pryのcommandはnilが戻ってくるので今のとこ繋げれない。
便利
で快適コードリーディングという話だけども、メソッド名曖昧にしか覚えてないけどメソッドのソースみたいみたいな要求がまあまああると思う。ないかもしれない。
こんなのを ~/.pryrcとかに書いとく。メソッド名は好きなように短くすれば良いと思う。
begin require 'ruby-anything' require 'pry-pipeline' rescue LoadError => err puts "Failed to require. in #{__FILE__}" end def method_source(obj) "#{obj.inspect}." + _anything_(obj.methods) | '$' end def instance_method_source(cls) "#{cls.inspect}#" + _anything_(cls.instance_methods) | '$' end
で、
$ pry [1] pry(main)> method_source Pry >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> anything風のインターフェースでメソッドを選択 例えば `run_command` ってメソッドを選択した場合 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> From: /Users/toqoz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_class.rb @ line 217: Number of lines: 12 Owner: #<Class:Pry> Visibility: public def self.run_command(command_string, options={}) options = { :context => TOPLEVEL_BINDING, :show_output => true, :output => Pry.output, :commands => Pry.commands }.merge!(options) output = options[:show_output] ? options[:output] : StringIO.new Pry.new(:output => output, :input => StringIO.new(command_string), :commands => options[:commands], :prompt => proc {""}, :hooks => Pry::Hooks.new).rep(options[:context]) end => nil
ちまちま Pry.methods.grep(/hoge/)
って、ああ、違うか、あ、これだ、pry> $ これ
みたいな過程が減る。pry-pipeline作るときに使ったPry.run_command
っていうメソッドも、ruby-anything使って、多分commandとかexec/runとかってメソッドがPry
に生えてるだろと思って、_anything_ Pry.methods
ってやって発見した。
まあこの話はこのメソッド見たいって明確に決まってる時はこれはあんま関係ないが、
ruby-anythingは一覧から何かを選択させたいみたいな時、 pry-pipelineもpryのコマンドになんかの結果を返したいみたいな時に汎用的に使えると思う。適当に組み合わせたらもっと便利なのできると思う。