2011-01-06 3 views
4

Я новичок в Ruby, как я могу считать элементы в цикле? В Java я бы написать этоКак считать в цикле?

int[] tablica = { 23,53,23,13 }; 
int sum = 0; 
for (int i = 0; i <= 1; i++) { // **only first two** 
    sum += tablica[i]; 
} 
System.out.println(sum); 

EDIT: Я хочу только первые два

+0

Этот Рубин или C? ;) –

ответ

4
tablica.take(2).reduce(:+) 

Но серьезно? Что случилось с только

tablica[0] + tablica[1] 

Эй, это даже работает в Рубине и Java & hellip; и C, C++, Objective-C, Objective-C++, D, C#, ECMAScript, PHP, Python. Без изменений.

+0

это не будет работать, если я не хочу, сколько элементов я хочу и передал функции как параметр (без огромного if). хороший трюк. – IAdapter

1

Если вам просто нужна сумма, вот простой способ:

tablica = [ 23,53,23,13 ] 
puts tablica.inject(0){|sum,current_number| sum+current_number} 

Для первых двух элементов (или любого смежного диапазона), вы можете использовать диапазон:

tablica = [ 23,53,23,13 ] 
puts tablica[0..1].inject(0){|sum,current_number| sum+current_number} 

Что это делает:

  1. Блок (заявление в {...}) называется внутренне inject, один раз для каждого элемента в массиве.
  2. На первой итерации, sum имеет начальное значение 0 (что мы перешли к inject) И current_number содержит 0-й элемент в массиве.
  3. Мы добавляем два значения (0 и 23), и это значение присваивается sum, когда блок возвращается.
  4. Затем на следующей итерации мы получаем sum переменную как 23 и current_number как 53. И процесс повторяется.
1

Есть много способов, но если вы хотите, чтобы текущий объект и счетчик использовать метод each_with_index

some_collection.each_with_index do |o, i| 
    # 'o' is your object, 'i' is your index 
end 

EDIT: К сожалению, прочитал, что слишком быстро. Вы можете сделать это

sum = 0 
some_collection.each { |i| sum += i } 
5

Вы можете суммировать все элементы в массиве, как это:

arr = [1,2,3,4,5,6] 
arr.inject(:+) 
# any operator can be here, it will be 
# interpolated between the elements (if you use - for example 
# you will get 1-2-3-4-5-6) 

Или, если вы хотите перебрать элементы :

arr.each do |element| 
    do_something_with(element) 

Или, если вам нужен индекс тоже:

arr.each_with_index do |element, index| 
    puts "#{index}: #{element}" 
+0

'arr.inject (: +)' => Это так здорово!: D – Zabba

+1

caveat: на пустых массивах вы обычно хотите вернуть 0, поэтому в некоторых решениях используется инъекция (0, ...). В противном случае вы получите нуль. – tokland

+0

@Zabba: Мне нравится, что это похоже на смайлик. –