機略戦記

Maneuver warfare

rubyでcall stack参照するメソッドがなんだっけ

結論

callerだった。

使用例:

$ pry
[1] pry(main)> caller
=> ["/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:355:in `eval'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:355:in `evaluate_ruby'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:323:in `handle_line'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:242:in `catch'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:242:in `block in eval'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:241:in `catch'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_instance.rb:241:in `eval'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/repl.rb:77:in `block in repl'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/repl.rb:67:in `loop'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/repl.rb:67:in `repl'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/repl.rb:38:in `block in start'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/input_lock.rb:61:in `call'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/input_lock.rb:61:in `__with_ownership'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/input_lock.rb:79:in `with_ownership'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/repl.rb:38:in `start'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/repl.rb:15:in `start'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/pry_class.rb:169:in `start'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/cli.rb:219:in `block in <top (required)>'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/cli.rb:83:in `call'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/cli.rb:83:in `block in parse_options'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/cli.rb:83:in `each'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/lib/pry/cli.rb:83:in `parse_options'",
 "/Users/hoge/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/pry-0.10.3/bin/pry:16:in `<top (required)>'",
 "/Users/hoge/.rbenv/versions/2.2.3/bin/pry:23:in `load'",
 "/Users/hoge/.rbenv/versions/2.2.3/bin/pry:23:in `<main>'"]

よもやま

ところでcallerって、メソッドだっけ? それとも特殊な変数か何か? というのが気になった。
このような疑問が湧いた時、defined?を使うと、コンソール上でこれを確認できる。

[9] pry(main)> defined? caller
=> "method"

ところでところで、defined?には調べたいもののシンボルや文字列では無く、調べたい物を直接渡す。

[11] pry(main)> defined? caller
=> "method"

おなじくメタ情報を取得する#methodの場合は、シンボルで引数として受け取ってる。

[13] pry(main)> method(:caller)
=> #<Method: Object(Kernel)#caller>

defined?はなんで構文上意味がある物を直接受け取る事ができるんだろう。
defined?はメソッドなんだろうか?
defined? defined?としてみたが syntax errorになってしまった。

すくなくともメソッドでは無い。

method(:defined?)
NameError: undefined method `defined?' for class `Object'
from (pry):17:in `method'