17

私はRubyonRails 3を使用していますが*、関数の引数の近くに演算子が存在することの意味を知り、他のシナリオでの使用法を理解したいと思います。

シナリオ例(このメソッドはRuby on Rails 3フレームワークからのものです):

def find(*args)
  return to_a.find { |*block_args| yield(*block_args) } if block_given?

  options = args.extract_options!

  if options.present?
    apply_finder_options(options).find(*args)
  else
    case args.first
    when :first, :last, :all
      send(args.first)
    else
      find_with_ids(*args)
    end
  end
end
4

2 に答える 2

46

これは ruby​​ に由来する splat オペレーターです (したがって、Rails 固有ではありません)。使用する場所に応じて、次の 2 つの方法で適用できます。

  • 多数の引数を配列に「パック」する
  • 配列を引数リストに分割する

関数では、関数定義で使用されている splat 演算子が表示されます。その結果、関数は任意の数の引数を受け入れます。args完全な引数リストは配列としてに入れられます。

def foo(*args)
  args.each_with_index{ |arg, i| puts "#{i+1}. #{arg}" }
end

foo("a", "b", "c")
# 1. a   <== this is the output
# 2. b
# 3. c

2 番目のバリアントは、次の方法を検討する場合です。

def bar(a, b, c)
  a + b + c
end

正確に 3 つの引数が必要です。このメソッドを次のように呼び出すことができます

my_array = [1, 2, 3]
bar(*my_array)
# returns 6

この場合に配列に適用されたスプラットは配列を分割し、配列の各要素を個々のパラメーターとしてメソッドに渡します。を呼び出しても同じことができますfoo:

foo(*my_array)
# 1. 1   <== this is the output
# 2. 2
# 3. 3

メソッドの例でわかるように、これらのルールはブロック パラメーターにも同じように適用されます。

于 2011-03-09T23:51:03.833 に答える
3

これは splat 引数です。これは基本的に、メソッドに渡された「余分な」引数はすべて *args に割り当てられることを意味します。

于 2011-03-09T23:23:12.813 に答える