Невозможно получить метод Ruby для передачи spec для метода Anagram

Я пытаюсь передать это, чтобы проверить, является ли аргумент анаграммой другого слова, но это просто не происходит.

  • Я могу получить строку (начиная с одного только слова) в массив, и это одно или несколько слов,
  • Затем он выполняет итерацию по массиву над каждым словом.
  • Использование оператора If для сравнения, если отсортированный объект равен сортированному аргументу.
  • Применяется .join, так как он выходил по одной букве за раз в irb, но это все еще не происходит, с или без .join.

      class String
        define_method(:anagrams) do |check_word|
          words = self.downcase
          check_word = check_word.downcase
          words_array = words.split(" ")
    
          words_array.each do |word|
            if (word.chars.sort) == (check_word.chars.sort)
              true
            else
              false
            end
          end
        end
      end
    

Любые идеи, почему это сломалось?

Ответ 1

words_array.each do |word|
  if (word.chars.sort) == (check_word.chars.sort)
    true
  else
    false
  end
end

Я предполагаю, что вы хотите return true, если любые слова являются анаграммами. Вы в настоящее время явно не возвращаетесь.

Лучше синтаксис Ruby будет words_array.any? { |word| word.chars.sort == check_word.chars.sort) }

ИЛИ

words_array.each do |word|
  return true if (word.chars.sort) == (check_word.chars.sort)
end

Ответ 2

Здесь другой способ увидеть, являются ли два слова w1 и w2 анаграммами друг друга:

def anagrams?(w1, w2)
  w1.size == w2.size && w1.chars.difference(w2.chars).empty?
end

где Array#difference это то, как я определил его в своем ответе здесь.

Array#difference похож на Array # -. Разница проиллюстрирована в следующем примере:

a = [1,2,3,4,3,2,2,4]
b = [2,3,4,4,4]

a     -      b #=> [1]
a.difference b #=> [1, 3, 2, 2] 

Попробуйте:

anagrams?("tops", "stop")  #=> true
anagrams?("tops", "stopz") #=> false
anagrams?("tops", "stopz") #=> false
anagrams?("tops", "sto")   #=> false