2017-02-10 4 views
1

Ich kam in diesem Beispiel, wo der Splat-Operator für sich allein in einer Methodendefinition verwendet wird:Was ist der eigenständige splat-Operator (*), der in Ruby verwendet wird?

def print_pair(a,b,*) 
    puts "#{a} and #{b}" 
end 

print_pair(1,2,3,:cake,7) 
#=> 1 and 2 

Es ist klar, was und warum Sie es in einem Kontext wie so verwenden würden:

def arguments_and_opts(*args, opts) 
    puts "arguments: #{args} options: #{opts}" 
end 

arguments_and_opts(1,2,3, a: 5) 
#=> arguments: [1, 2, 3] options: {:a=>5} 

Aber warum und wie würden Sie es im ersten Beispiel verwenden? Da es in den Ruby-Spezifikationen definiert ist, muss es einen Usecase dafür geben?

+0

wo haben Sie einen solchen Code gefunden? –

+0

@AndreyDeineko Es ist von diesem Artikel http://www.monkeyandcrow.com/blog/the_strange_ruby_splat/, aber ich habe auch solche Definitionen gefunden, während ich durch einige Rubygems Quellcode gegangen bin. – Severin

+0

_ "Da es in den Ruby-Spezifikationen definiert ist" _ - wo? – Stefan

Antwort

5

In einer Parameterliste, *args bedeutet "verschlingen alle verbleibenden Argumente in einem Array und binden sie an den Parameter args dem Namen". * bedeutet "Verschlingen Sie alle verbleibenden Argumente und binden Sie sie an nichts", oder setzen Sie einfach "ignorieren Sie alle verbleibenden Argumente".

Und das ist genau dann, wenn Sie dies verwenden würden: Wenn Sie alle verbleibenden Argumente ignorieren möchten. Entweder, weil Sie nicht Pflege über sie, oder weil Sie sich nicht um sie kümmern (aber jemand anderes könnte):

def foo(*) 
    # do something 
    super 
end 

Denken Sie daran: super ohne Argument Liste übergibt die Argumente unverändert weiter. Also, obwohl diese Override von foo die Argumente ignoriert, sind sie immer noch für die Implementierungen der Superklasse der Methode verfügbar; Dennoch macht die Definition deutlich, dass diese Implementierung nicht kümmert.

+0

Sehr hilfreiche Erklärung, danke! – Severin

0

Es wird betont, dass diese Methode zwei Argumente benötigt, aber Sie können einen beliebigen Betrag übergeben (rest wird ignoriert).

Sie können mit Method#parameters Methodenparameter überprüfen:

method(:print_pair).parameters 
#=> [[:req, :a], [:req, :b], [:rest]] 
Verwandte Themen