2017-02-03 1 views
1

Ich arbeite gerade an einer sehr einfachen Übung: ein Verfahren, das zwischen zwei und einer unbestimmten Anzahl von Schwimmern vermehren kann. Meine erste Idee dafür war, den Splat-Operator zu verwenden:Wie übergebe ich (2-∞) Argumente an eine Ruby-Methode?

Das war nicht erfolgreich. Ich habe dann versucht diese:

def multiply *numbers 
    total = 1 
    numbers.each do |x| 
    total = total * x 
    end 
    total 
end 

Die oben ist fast erfolgreich-das Problem ist, dass es ein einziges Argument zu akzeptieren, und ich will es zumindest zwei verlangen. Wie kann ich das erreichen?

Antwort

4

Es gibt viele Möglichkeiten. Der eine der Autor der Übung wahrscheinlich die für Sie inject ist zu verwenden:

def multiply(*numbers) 
    numbers.inject(&:*) 
end 

Dies wird das gleiche Problem wie Ihre zweite Implementierung von multiply, dass dazu führen, dass 0 oder 1 Argumente akzeptieren. Sie können dieses Problem beheben, indem Sie einfach ein ArgumentError erhöhen, wenn Sie nicht mindestens zwei haben:

def multiply(*numbers) 
    raise ArgumentError unless numbers.length >= 2 
    numbers.inject(&:*) 
end 

Sie können den anderen Weg gehen und zwei aktuelle Argumente übernehmen und den Rest zu und einfach bauen die kompletten Array Sie beabsichtigen zusammen multiplizieren:

def multiply(a, b, *rest) 
    [a, b, *rest].inject(&:*) 
end 
+0

Es ist erwähnenswert, dass Sie auch eine Zeichenfolge als zweites Argument an 'raise' übergeben können, die als hilfreiche Nachricht dienen kann. –

+0

Super, danke. Ich wusste nicht über inject. Können Sie die '(&: *)' Notation erklären, die der Methode folgt? – adc17

+1

@adc Siehe https://stackoverflow.com/questions/1961030/ruby-ampersand-colon-shortcut – meagar

Verwandte Themen