有人可以解释为什么这个用于查找字谜的红宝石代码有效吗?

cha*_*768 2 ruby function

这是行:

words.group_by { |word| word.downcase.chars.sort }.values
Run Code Online (Sandbox Code Playgroud)

words是一个单词数组,如果它们与原始数组中的另一个单词共享相同的字母,则将它们分组.有人可以下线并解释这是如何工作的吗?

and*_*ich 8

好的,让我们逐一介绍这些方法:

group_by:是一个采用Enumerable(在这种情况下是一个数组)和一个块的方法.它将数组中的每个值传递给块,然后查看块的结果.然后它返回一个Hash,其中键是块的结果,值是具有相同结果的原始输入的数组.

downcase:接受一个字符串,使其全部小写

chars:将字符串转换为字符数组

sort:对一个集合进行排序

values:只返回a的值Hash.

有了这些定义,让我们回到你的代码:

words.group_by { |word| word.downcase.chars.sort }.values
Run Code Online (Sandbox Code Playgroud)

"取下每个word数组words,将其设为小写,然后将其字母按字母顺序排序.包含完全相同字母的单词将具有相同的排序结果,因此我们可以将它们分组为Hash of Arrays,其中包含已排序的字母作为键和匹配单词的数组作为值.我们实际上并不关心实际字母是什么,只是分享它们的单词,所以我们只采用数组(the values).

用一个例子来分解它:

words = %w[throw worth threw Live evil]
  # => [ 'throw', 'worth', 'threw', 'Live', 'evil' ]
words_hash = words.group_by {|word| word.downcase.chars.sort} 
  # => {
  #      'eilv'  => [ 'evil', 'Live' ],
  #      'ehrtw' => [ 'threw'],
  #      'hortw' => [ 'throw', 'worth']
  #    }

words_hash.values
  # => [['evil', 'Live'], ['threw'], ['throw', 'worth']]
Run Code Online (Sandbox Code Playgroud)