guessメソッド

欲しいメソッドを推測するguessというメソッドを作ってみた。

使い方

元の値.guess(目的の値,引数…)

irb> require 'guess'
=> true
irb> 1.guess 2   ← 1から2になるメソッドを探す
=> ["next", "succ"]
irb> [1,2,3].guess 3   ← [1,2,3]から3を返すメソッドを探す
=> ["nitems", "size", "last", "max", "pop", "length"]
irb> 1.guess 2 ,1   ← 1に引数1を与えると2になるメソッドを探す
=> ["<<", "+"]

guess.rb

require 'stringio'
class Object
  def guess(ans,*arg)
    $stdout, v, $VERBOSE = StringIO.new, $VERBOSE, nil
    r=methods.select{|m| (dup rescue self).send(m,*arg)==ans rescue false }
    $stdout, $VERBOSE = STDOUT, v
    r
  end
end

おぼえがき

表示系のメソッドがあるので$stdoutはリダイレクトしないと表示が崩れる。
dupしておかないと破壊的メソッドを使ってしまった後の結果が変わってしまう。

数値などの immutable なオブジェクトは close や dup が禁止されています。

http://kansai.anesth.or.jp/gijutu/ruby/man-z1/refm0047.html