Od niedawna chłonę dość szybko podstawy Rubiego. Narodził mi się taki problem.
a = Array.new
5.times { a.push(%w[1 2 3 4 5 6]) }
Mamy sobie taką oto tablicę dwuwymiarową. Chciałbym wartość każdego jej elementu zwiększyć o 1 (przy okazji konwertując te elementy do typu numerycznego). Pierwszy pomysł:
for i in 0..a.length-1 do
for j in 0..a[i].length-1 do
a[i][j] = a[i][j].to_i+1
end
end
Śmierdzi mi to mocno C, bo w nim programowałem do tej pory, ale działa. Domyślam się jednak, że nie jest to sposób godny Rubiego. Podejście drugie:
a = a.collect do |x|
x.collect do |y|
y+1
end
end
To już mi zdecydowanie bardziej pasuje, przynajmniej semantycznie. Wydaje mi się jednak, że rozwiązanie jest mało optymalne. Otóż, gdybym nie chciał modyfikować każdego elementu mojej tablicy dwuwymiarowej, tylko np. wybraną garstkę, która spełnia jakiś tam określony warunek to i tak interpreter Rubiego stworzyłby kopię mojej tablicy i po zmodyfikowaniu przypisałby do zmiennej a.
Jeżeli modyfikowanych byłyby tylko 6 elementów z 36, przypisywanie tych 30, które się wcale nie zmieniły byłoby niepotrzebne.
a = a.collect do |x|
x.collect do |y|
if y==6
y+1
else
y
end
end
end
Jeżeli dobrze rozumuję, to jak zrobić to dobrze i wydajnie w stylu Rubiego, a jeżeli źle to powiedzcie mi proszę dlaczego :).
Pozdrawiam