Help us understand the problem. What is going on with this article?

配列のアルファベットを大小区別せずに並べ換える

「ruby 配列 アルファベット 大小区別なし」とかでいろいろ検索してもなかなかたどり着かなかったので備忘録として
誰かの助けになれば嬉しいです

words = ["happily", "Happy", "happines", "Happily"]
words.sort! do |a, b|
  ret = a.casecmp(b)
  ret == 0 ? a <=> b : ret
end
p words

casecmpってやつがどうやら大小を区別せずに並べ替えてくれるやつらしいです
3行目でretに-1,0,1のどれかを返します
aがbより先なら-1,同じなら0,後ろなら1を返します。
Comparableモジュールのやつですね

<=>は、等しければ0、左項が大きければ1、左項が小さければ-1を返す演算子です。

4行目で大小区別しない場合に0が帰ってきている(aとbが等しい)場合は大小区別して比較するという作業をしています。

その作業を配列の中身の分だけ繰り返しています。

コメントをいただいたので追加

words.sort_by!{ |word| [word.downcase, word] }

これでも大丈夫なようです。
こっちの方がスッキリしていていいですね!

終わり

この投稿に誤りや改善点があればコメントで教えてください。
よろしくお願いします。
もし役に立ったらいいね!お願いします!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away