Невозможно получить метод 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