0

次の Ruby コードがあるとします。

def result(b=25)
  puts b
end

を呼び出すだけresultで、25 が出力されます。これまでのところ、問題ありません。

しかし、次のように別のメソッドから呼び出したいと思います。

def outer(a,b)
  #...do some stuff with a...
  result(b)
end

outer(1,5)5 を出力したいのですがouter(1)、単純に 25 を出力します。実際には、「未定義」をresultメソッドに渡したいのです。

これを行う方法はありますか?(悲しいことに、単純に を使用することはできませんdef outer(a,b=25)。なぜなら、 のデフォルト値は、実際にはメソッドbであるクラスのインスタンス変数だからです。)result

4

3 に答える 3

2

これはどうですか:

def outer(a,b = nil)
  ...do some stuff with a...
  result(*[b].compact)
end

b が nil でない場合は result(b) を呼び出し、b が nil の場合は result() を呼び出します。

于 2013-01-25T19:09:02.187 に答える
0

My proposed solution changes your initial problem just a tiny bit, but it's close. You can default the second value of outer with the inner method, and then call the inner method again. It works a bit strangely if you are actually outputting something, but if you don't call puts, it works pretty well.

def result(b=25)
  b
end

def outer(a, b = result)
  #...do stuff with a...
  puts result(b)
end

This will assign the default to b only if you don't provide it. If you do provide it, it will then use that b in result. Functionally it seems to work the way you want it, the only caveat is that if your inner method were doing something non-trivial, you would be duplicating the work in the default case.

于 2013-01-25T20:24:24.617 に答える
0

これを解決するオプションは、b を getter メソッドの後ろに置くことです。

def get_b
  @b
end

def outer(a, b = get_b)
  #...do some stuff with a...
  result(b)
end
于 2013-01-25T19:03:05.720 に答える