Может ли кто-нибудь объяснить, почему "time"
- это максимальное значение здесь?Как анализировать метод «max»
my_array = %w{hello my time here is long}
my_array.max #=> "time"
Может ли кто-нибудь объяснить, почему "time"
- это максимальное значение здесь?Как анализировать метод «max»
my_array = %w{hello my time here is long}
my_array.max #=> "time"
Поскольку в алфавитном порядке t
в time
больше здесь, среди других в массиве my_array
.
Вот один из способов, как произошло сравнение строк:
'hello' > 'time' # => false
'my' > 'time' # => false
'here' > 'time' # => false
'is' > 'time' # => false
'long' > 'time' # => false
Чтобы понять выходы выше фрагмент кода, вы должны должны видеть String#<=>
документации. Поскольку ваш my_array
содержит все экземпляры строк, которые вызвали метод <=>
, чтобы построить вывод max
.
Documentations говорит Enumerable#max
:
перечислимых # макс, без блока предполагает, что все объекты реализации
Comparable
.
Ahhh спасибо !!! Теперь имеет смысл ... – user3007294
«больше» - это, вероятно, не то слово, которое вы имели в виду. «больше» будет более корректно относиться к сопоставлениям символов. –
Вот как компьютеры смотрят на строки и сравнивают их.
Если мы посмотрим на первые символы каждого слова, это поможет немного, потому что мы знаем, как алфавит заказывает письма:
%w[hello my time here is long].map{ |s| s[0] }.sort # => ["h", "h", "i", "l", "m", "t"]
Но это не помогает визуализировать его, так вот посмотрите на письма каждого слова, как компьютер видит их:
%w[time tome].each do |w|
puts w.chars.map(&:ord).join(', ')
end
# >> 116, 105, 109, 101
# >> 116, 111, 109, 101
Каждая буква имеет значение. За эти годы было много разных способов упорядочивания букв для компьютера, что заставило персонажа оценивать отображение для изменения. EBCDIC и ASCII были самыми популярными, но имеют разные заказы. Обычно мы имеем дело с ASCII или производным, установленным ОС.
Посмотрите, как символы в словах представлены значениями на следующем выходе. Это должно облегчить понимание того, что делает компьютер.
%w[he hello help holler hollow].sort.each do |w|
puts '"%6s": %s' % [ w, w.chars.map(&:ord).join(', ') ]
end
# >> " he": 104, 101
# >> " hello": 104, 101, 108, 108, 111
# >> " help": 104, 101, 108, 112
# >> "holler": 104, 111, 108, 108, 101, 114
# >> "hollow": 104, 111, 108, 108, 111, 119
Документов есть ответ: http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-max и http://ruby-doc.org/core- 2.0.0/String.html # method-i-3C-3D-3E –
["лексикографическая сортировка"] (http://en.wikipedia.org/wiki/Lexicographic_order); см. также ['Enumerable # max_by'] (http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-max_by). – Phrogz
Получите привычку проверять подобные вещи в irb. –