4

次のように定義および使用されるメソッドを見ました。

def mention(status, *names)
  ...
end
mention('Your courses rocked!', 'eallam', 'greggpollack', 'jasonvanlue')

splat を使用して引数を配列に結合する代わりに、配列を 2 番目の引数として使用しないのはなぜですか?

def mention(status, names)
  ...
end
mention('Your courses rocked!', ['eallam', 'greggpollack', 'jasonvanlue'])

これにより、最後により多くの引数が許可されます。

def mention(status, names, third_argument, fourth_argument)
  ...
end
mention('Your courses rocked!', ['eallam', 'greggpollack', 'jasonvanlue'], Time.now, current_user)
4

4 に答える 4

3

この方法は単一または複数の名前に合理的に適用できるため、感嘆符は自然に感じられます。mention('your courses rocked!', ['eallam']). _ また、splat は、メソッドがArray.

また、他の引数を に入れられない理由はありません*names:

def mention(status, arg2, arg3, *names)
def mention(status, *names, arg2, arg3)
于 2013-10-18T00:10:39.563 に答える
2

Cary Swoveland と vgoff が言及しているように、次のような定義

def foo arg1, *args, arg2
  ...
end

可能であるため、最後のポイントは当てはまりません。


ユースケースによって異なります。そのメソッドが、当然配列として与えられる引数を取る場合、ユーザーは配列を渡す方が簡単になります。たとえば、メソッドがbacktrace_locations引数として (配列) を取るとします。次に、持っている方が良いでしょう:

def foo arg1, backtrace_locations, arg2
  ...
end
foo("foo", $!.backtrace_locations, "bar")

それよりも:

def foo arg1, *backtrace_locations, arg2
  ...
end
foo("foo", *$!.backtrace_locations, "bar")

別のケースでは、柔軟な数の引数を入力するのがユーザーである場合、Sean Mackesey も指摘しているように、ユーザー[]は要素が 1 つしかないときに要素の周囲を忘れる可能性があるため、次のようにすることをお勧めします。

def foo arg1, *args, arg2
  ...
end
foo("foo", "e1", "bar")
foo("foo", "e1", "e2", "e3", "bar")

それよりも:

def foo arg1, args, arg2
  ...
end
foo("foo", ["e1"], "bar")
foo("foo", ["e1", "e2", "e3"], "bar")
foo("foo", "e1", "bar") # => An error likely to happen
于 2013-10-18T03:27:34.157 に答える
2

スプラットはより柔軟です。引数を配列に入れるよりも、引数を入力する方が簡単です。

于 2013-10-17T23:56:24.497 に答える
1

それは、クリーンなコードと柔軟性の両方です。Splat は柔軟性を提供しますが、各入力を明示的に宣言すると、メソッドがそれらの入力オブジェクトにより近くバインドされます。コードが後で変更された場合はどうなりますか? さらにフィールドを追加する必要がある場合はどうしますか? 彼らを何と呼ぶか​​知っていますか?このメソッドを別の場所で変数入力に使用する必要があるとしたら? Splat は多くの柔軟性を追加し、メソッド宣言を簡潔に保ちます

あまりにも多くのパラメーターをリストすることも、コードの匂いです。

これをチェックしてください:いくつのパラメータが多すぎますか?

そしてここ: http://www.codinghorror.com/blog/2006/05/code-smells.html

Long Parameter List:
The more parameters a method has, the more complex it is.
Limit the number of parameters you need in a given method,
or use an object to combine the parameters.
于 2013-10-18T00:08:15.323 に答える