Рубиновый массив — наибольшее целое число

совершенно новый для Ruby, и мне это нравится. Просто поиграйте с приведенным ниже кодом:

    public
    def highest 
      highest_number = 0
      each do |number|
        number = number.to_i
        highest_number = number if number > highest_number
        puts highest_number 
      end
    end


    array = %w{1 2 4 5 3 8 22 929 1000 2}
    array.highest

Итак, на данный момент я получаю ответ:

    1
    2
    4
    5
    5
    8
    22
    929
    1000
    1000

Таким образом, он сначала помещает массив, а затем также наибольшее число из массива. Однако все, что я хочу, это поставить только самый высокий номер...

Я играл с этим и не могу понять! Извините за такой вопрос новичка


person Charlie Davies    schedule 03.08.2011    source источник


Ответы (3)


Проблема в том, что у вас есть оператор puts внутри цикла each, поэтому во время каждой итерации он выводит максимальное число на данный момент. Попробуйте переместить его за пределы цикла each, чтобы получилось следующее:

public

def highest
  highest_number = 0
  each do |number| 
    number = number.to_i
    highest_number = number if number > highest_number
  end
  puts highest_number
end

array = %w{1 2 4 5 3 8 22 929 1000 2}
array.highest

Что дает желаемый результат:

1000
person Chris Bunch    schedule 03.08.2011
comment
@Charlie: Вы можете сказать спасибо, приняв ответ Криса. - person mu is too short; 03.08.2011

Вы также можете избавить себя от некоторых проблем, используя max_by:

>> a = %w{1 2 4 5 3 8 22 929 1000 2}
=> ["1", "2", "4", "5", "3", "8", "22", "929", "1000", "2"]
>> m = a.max_by { |e| e.to_i }
=> "1000"

Вы также можете использовать другую версию max_by:

m = a.max_by(&:to_i)

чтобы избежать лишнего шума «блока, который просто вызывает метод».

Но это, вероятно, упражнение для изучения блоков Ruby, поэтому использование существующих частей стандартных библиотек не считается. OTOH, полезно знать, что есть в стандартных библиотеках, так что загляните на max_by или max также считается учебным упражнением.

person mu is too short    schedule 03.08.2011

Вы можете сделать это вместо этого и избежать переменной highest_number.

array = %w{1 2 4 5 3 8 22 929 1000 2}

class Array
  def highest
    collect { |x| x.to_i }. \
    sort.                   \
    last.to_i
  end
end

array.highest # 1000

В этом случае collect { |x| x.to_i } также может быть записано как collect(&:to_i).

person Ocaj Nires    schedule 03.08.2011
comment
Спасибо за это! Потрясающая помощь! - person Charlie Davies; 04.08.2011