1

私はRubyアプリケーションの開発に取り組んでおり、プットなどを使用してメソッド内の変数を表示し、何が起こっているのかを追跡しています。もちろん、それはメソッドの「リターン」を変更することでした。そのメソッドを終了する前に、メソッド内の現在の戻り変数にアクセスできる一般化された Ruby 変数はありますか? そうすれば、プットにアクセスして、終了する前に再度設定することができます。メソッドの最後の結果が転送されることを理解しています。私は特に、デバッグしているメソッドに関係なく、その変数にアクセスする一般化された方法を探しています。

私は Rubymine を IDE として使用しており、デバッグにも使用しています。しかし、IRB のような REPL には興味深いものがあります。それはおそらく私の中で360のアセンブラープログラマーですが、私は自分自身と付き合っています。1969年に最初にプログラミングした人は何人ですか? 笑。

ありがとう。

4

3 に答える 3

5

1つのオプションは.tap方法かもしれません。あなたが持っていたと仮定すると

x = foo

そして、外部からの戻り値が何であるかを知りたがっていましたfoo:

x = foo.tap { |r| puts r.inspect }

の残りputs r.inspectは書かれておりp r、これは同じことの有効な省略形の構文です(ちなみに、pそのパラメーターを返すので、多くの場合、返された変数の前に文字通り a を貼り付けることができますp-いくつかの構文の細かさを除いて)

または、 の内部をチェックしたい場合foo、定義は次のようになります。

def foo
  # Do stuff
  something_that_is_returned
end

.tap戻り値に影響を与えることなく、最後のステートメントに を追加できます。

def foo
  # Do stuff
  something_that_is_returned.tap { |r| p r }
end

これが機能.tapするのは、 が現在のオブジェクトをブロックに譲り、ブロックの戻り値に関係なく元のオブジェクトを返すためです。.tapメソッドの長いチェーンに aを挿入して中間結果を検査すると非常に便利です。

たとえば、あなたは持っています

x = foo.map {|x| whatever}.select {|x| whatever}

select多くのコードを書き直すことなく、何が受信されているかを知りたい:

x = foo.map {|x| whatever}.tap { |r| p r }.select {|x| whatever}

これを頻繁に行う場合は、グローバル メソッドを定義することをお勧めします。

def tapp
  tap do |o|
    p o
  end
end

.tapp使用するには、式に追加するだけです。

something_that_is_returned.tapp
于 2013-06-11T19:45:58.960 に答える
3

または、もう少し表現力を高めたい場合は、メソッドを定義できます

def puts_and_return(r)
    puts r
    r
end

そして使用する

puts_and_return (last statement of method)
于 2013-06-11T19:56:08.033 に答える