Przekazywanie paramterów tablicowych do funkcji

Chcę napisać funkcję której jako paramter podaję tablicę a ona oblicza sumę wszystkich elementów.

irb(main):001:0> def wyr(*tab) irb(main):002:1> sum=0 irb(main):003:1> sum = sum + tab.map(&:to_i) irb(main):004:1> end => nil irb(main):005:0> wyr(1,2,3,4) TypeError: Array can't be coerced into Fixnum from (irb):3:in `+' from (irb):3:in `wyr' from (irb):5 from /usr/bin/irb:12:in `<main>' irb(main):006:0>
Wiecie co robie źle, jak przejść przez wszystkie elementy tablicy? I czy dobrze konwertuje?

Moze cos takiego ?

def wyr *tab sum=0 sum = sum + (tab).sum sum end wyr 1,2,3,4
A nie dziala Ci bo “map” zwroci tablice intow.

Lub jesli chcesz bardzo ladnie to zrobic to:

def wyr *tab tab.map(&:to_i).inject(0){|initial, current| initial + current } end wyr 1,2,3,4

[quote=phocke]def wyr *tab tab.map(&:to_i).inject(0){|initial, current| initial + current } end wyr 1,2,3,4
[/quote]

def sum *tab tab.reduce(:+) end
No i przede wszystkim to nie przekazujesz do tej funkcji tablicy.

wyr 1,2,3 <- przekazanie listy argumentów
wyr [1,2,3] <- przekazanie tablicy

[quote=kham][quote=phocke]def wyr *tab tab.map(&:to_i).inject(0){|initial, current| initial + current } end wyr 1,2,3,4
[/quote]

def sum *tab tab.reduce(:+) end
No i przede wszystkim to nie przekazujesz do tej funkcji tablicy.

wyr 1,2,3 <- przekazanie listy argumentów
wyr [1,2,3] <- przekazanie tablicy[/quote]
No i jest okej, jeśli chce podliczać argumenty, to *tab złączy je w tablicę. Problem nastąpi, jeśli jako argument przekaże tablicę. Wtedy będzie tablica argumentów z tablicą.

def sum *tab tab.flatten.reduce(:+) end