try
実装方法をお見せしましょう。自分で確認したい場合は、activesupportのソースをご覧ください。/lib/active_support/core_ext/object/try.rbで定義されています
class Object
def try(*a, &b)
if a.empty? && block_given?
yield self
else
public_send(*a, &b)
end
end
end
これが基本的に行うことは、メソッド名と完全な引数をに送信することObject
です。public_send
sendと同じですが、パブリックメソッドの呼び出しにのみ使用できます。
だから私はあなたの問題をデバッグするためにこれを書き直しました:
class Object
def try(*a)
result = public_send(*a)
puts $1.inspect
result
end
end
string = "Hello"
string.try(:match, /^(\w*)/)
puts $1.inspect
この出力
"Hello"
nil
それで、大きな疑問が生じます:これはルビーインタプリタのバグですか?。多分。少なくとも、公式の情報源には文書化されていません。次のことを伝える参照を見つけました(グローバル変数を参照してください)。
[...]、$_
ローカル$~
スコープがあります。それらの名前はグローバルであるべきであることを示唆していますが、この方法の方がはるかに便利であり、これらの名前を使用する歴史的な理由があります。
$1
したがって、カーネルによってグローバル変数として報告されていても、グローバル変数ではないようです。
1.9.3-p194 :001 > global_variables
=> [:$;, :$-F, :$@, :$!, :$SAFE, :$~, :$&, :$`, :$', :$+, :$=, :$KCODE, :$-K,
:$,, :$/, :$-0, :$\, :$_, :$stdin, :$stdout, :$stderr, :$>, :$<, :$.,
:$FILENAME, :$-i, :$*, :$?, :$$, :$:, :$-I, :$LOAD_PATH, :$",
:$LOADED_FEATURES, :$VERBOSE, :$-v, :$-w, :$-W, :$DEBUG, :$-d, :$0,
:$PROGRAM_NAME, :$-p, :$-l, :$-a, :$binding, :$1, :$2, :$3, :$4, :$5, :$6,
:$7, :$8, :$9]
念のため、この不整合をRubyバグトラッカーに転送しました。Rubyバグ#6723を参照してください