Вставить массив в другой массив с помощью 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

ОБНОВЛЕНИЕ: основываясь на комментарии Кэри (я предполагаю, что он имел в виду разделение, когда он сказал сканирование), я удалил лишний аргумент для разделения.

Другие вопросы по тегам