0

メソッドを別のメソッド内で使用return_argumentsし、次のように、引数名を言及する必要なく引数を返すようにしたいと考えています。

def foo a, b, *c
  ... # part a
  p return_arguments
  ... # part b
end

foo(1, "blah blah", :a, :b)
... # return from part a
# => [1, "blah blah", :a, :b]
... # return from part b

これは可能ですか?bindinglocal_variables、およびが使用される可能性があることがわかりましたが、上記evalで定義された他のローカル変数と引数を区別する方法がわかりませんpart a。の特定の順序付け規則はありlocal_variablesますか? arityもしそうなら、引数を抽出するためにそれを一緒に使うことができるかもしれません。

4

3 に答える 3

1

メソッドで最初のものを使用local_variablesします。つまり、ローカル変数を設定する前に、後で使用するために結果を保存します。

于 2012-09-30T19:30:33.407 に答える
1

それは間違いなく非効率的ですが、解決策は次のとおりです(ただし、@ tadmanが言及したようなハッシュを使用する必要があります):

set_trace_func proc { |e,_,_,i,b,_|
   if e == 'call'
      p = method(i).parameters
      @arguments = p.map {|p| eval(p[1].to_s,b)}
   end
}

def foo a, b, *c
   a = 50
   b = 3
   return @arguments
   a = 11
   b = 2
end

p foo(1, "blah blah", :a, :b)
于 2012-10-05T02:36:44.097 に答える
1

おそらく最も簡単なのは、次のようなものです。

def foo(*args)
  a, b, *c = *args
  # (...)
  p args
  # (...)
end

または逆に:

def foo(a, b, *c)
  args = [a, b, *c]
  # (...)
  p args
  # (...)
end

少なくとも一度は引数名に言及することに反対する理由がわかりません。メソッド内で「引数」を割り当てる (完全な配列を保持する) か、解析された引数から配列を再構築するのが最も簡単で読みやすいです。

于 2012-09-30T19:43:34.847 に答える