Вставить массив в другой массив с помощью Ruby и вернуть квадратные скобки
Я потратил несколько часов на поиск способа вставить массив в другой массив или в хеш. Заранее извиняюсь, если форматирование этого вопроса немного грязное. Это первый раз, когда я задаю вопрос о Stackru, поэтому я пытаюсь научиться правильно оформлять свои вопросы.
Я должен написать некоторый код, чтобы сделать следующий тестовый модуль мимо:
class TestNAME < Test::Unit::TestCase
def test_directions()
assert_equal(Lexicon.scan("north"), [['direction', 'north']])
result = Lexicon.scan("north south east")
assert_equal(result, [['direction', 'north'],
['direction', 'south'],
['direction', 'east']])
end
end
Самое простое, что я придумал, это ниже. Первая часть проходит, но затем вторая часть не возвращает ожидаемый результат, когда я запускаю rake test
,
Взамен или возвращение:
[["direction", "north"], ["direction", "south"], ["direction", "east"]]
это возвращается:
["север", "юг", "восток"]
Хотя, если я печатаю результат y как строку в консоли, я получаю 3 отдельных массива, которые не содержатся в другом массиве (как показано ниже). Почему он не напечатал крайние квадратные скобки массива, у?
["direction", "north"] ["direction", "south"] ["direction", "east"]
Ниже приведен код, который я написал в попытке пройти тестовый блок выше:
class Lexicon
def initialize(stuff)
@words = stuff.split
end
def self.scan(word)
if word.include?(' ')
broken_words = word.split
broken_words.each do |word|
x = ['direction']
x.push(word)
y = []
y.push(x)
end
else
return [['direction', word]]
end
end
end
Любые отзывы об этом будут высоко оценены. Спасибо всем большое заранее.
2 ответа
То, что вы видите, является результатом each
, который возвращает итерируемую вещь, или в этом случае, broken_words
, Что вы хотите collect
который возвращает преобразованные значения. Обратите внимание на ваш оригинал, y
никогда не используется, он просто выбрасывается после написания.
Вот исправленная версия:
class Lexicon
def initialize(stuff)
@words = stuff.split
end
def self.scan(word)
broken_words = word.split(/\s+/)
broken_words.collect do |word|
[ 'direction', word ]
end
end
end
Стоит отметить, что несколько вещей были изменены здесь:
- Расщепление на произвольное количество пробелов, а не на одно.
- Упрощение до одного случая вместо двух.
- Устранение лишнего
return
заявление.
Одна вещь, которую вы могли бы рассмотреть, это использование структуры данных, как { direction: word }
вместо. Это делает ссылки на значения намного проще, так как вы бы сделали entry[:direction]
избегая неоднозначного entry[1]
,
Если вы не создаете экземпляры объектов Lexicon, вы можете использовать Модуль, который может прояснить, что вы не создаете экземпляры объектов.
Кроме того, нет необходимости использовать дополнительную переменную (например, broken_words), и я предпочитаю синтаксис блока { }, а не синтаксис do..end для функциональных блоков по сравнению с итеративными блоками.
module Lexicon
def self.scan str
str.split.map {|word| [ 'direction', word ] }
end
end
ОБНОВЛЕНИЕ: основываясь на комментарии Кэри (я предполагаю, что он имел в виду разделение, когда он сказал сканирование), я удалил лишний аргумент для разделения.