1

たとえば、yield(param)を使用しても、ブロック{| p1、p2 |を渡すと、問題が発生します。...}これには2つのパラメーターがあります。どのパラメータの生成に時間がかかるかわからない場合、どうすればこれを防ぐことができますか?

4

3 に答える 3

1

ブロックでスプラットを使用するか、そこにある可能性のある変数を渡して、それらの定義をテストします。

def foo
  yield 1, 2, 3
end

foo do |*args|
  if 3 == args.length
    # ... then I know I'm dealing with 3 args
  end
end

foo do |a, b, c, d|
  if !d.nil?
    # ... then I know i was passed `d`
  end
end
于 2013-03-25T05:13:57.250 に答える
0

Ruby Blocks、Procs、Lambdasに関するこの優れたブログ投稿を参照してください。

Rubyブロック、Procs、Lambdaを理解する

ブロック(渡されるものなど)は、渡される引数の数をチェックしないProcfoo() {|p1,p2| ...}のように機能することを説明しています。ただし、ラムダはそうします。したがって、引数の数を厳密にチェックする必要がある場合は、メソッドでBlockを受け入れることから、メソッド引数としてLambdaを受け入れることに切り替えることができます。

于 2013-03-25T05:10:55.960 に答える
0

の代わりにブロック引数を使用する必要があります。これにより、アリティなどyieldよりも多くの情報が提供されます。yield

def foo *params, &block
  ...
  block.call(*params) if params.length == block.arity
  ...
end

foo(3){|x| puts x*3} # => 9
foo(3, 4){|x| puts x*3} # => Does not do anything
于 2013-03-25T05:13:45.383 に答える