Robert H. wrote in post #1155030:
Can someone explain to me why it works?
array.sort_by{|x| [x.name, -x.date] }
Why does this kind of sorting work on an Array input?
When an Array calls a method, the block specified after
the method call does not have to take an array as
an argument. Here is an example:
class Array
def do_stuff
if block_given?
map do |array_elmt|
yield array_elmt
end
else
self
end
end
end
data = [10, 20, 30]
y = data.do_stuff { |x| x*2 }
p y
y = data.do_stuff
p y
–output:–
[20, 40, 60]
[10, 20, 30]
Enumerable#sort_by() uses a block in a similar fashion.
sort_by() sends each
element of an Array that you want to sort to the block to create a new
value that it will use
as a stand in for the original value when sorting. The return values
from the block are what sort_by() uses as the values to sort. For
example, look at this Hash:
mapped_orig_vals = {
['David', 2] => objA
['David', 1] => objB,
}
After creating each entry in the hash, sort_by() sorts the keys, which
are arrays, to produce:
ordered_keys = [
[‘David’, 1],
[‘David’, 2],
]
After sorting the keys, sort_by() looks up the value
associated with each key to get the original value, e.g.
ordered_orig_vals = ordered_keys.map do |key|
mapped_orig_values[key]
end
#=>[objB, objA]
How would I know that it first starts by the first
Array member, and then the second?
If by Array you mean the Array returned by the sort_by() block, you
would know by reading about how ruby determines whether two
arrays are equal or not:
In every computer programming language I’ve studied, things like Arrays
and Strings are always compared by starting with the first
element/character, and if they are the same, then the second element is
compared, etc. Once a difference is found, then one Array/String is
considered smaller than the other Array/String. If all the elements are
the same but one Array/String is shorter than the other, the shorter one
is considered smaller. If all the elements are the same, and they are
the same length, then they are considered equal.
On the other hand, if by Array you mean the original Array you are
trying to sort, it is irrelevant which end of the array you start at.