使用Ruby将数组推入另一个数组,并返回方括号

时间:2014-11-21 15:37:49

标签: ruby arrays unit-testing assertion learn-ruby-the-hard-way

我花了几个小时搜索将数组推入另一个数组或哈希的方法。如果这个问题的格式有点混乱,请提前道歉。这是我第一次在StackOverflow上提出问题,所以我试图让我的问题得到正确的设计。

我必须编写一些代码来使以下测试单元过去:

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时,第二部分没有返回预期的结果。

代替或返回:

  

[[&#34; direction&#34;,&#34; north&#34;],[&#34; direction&#34;,&#34; south&#34;],[&#34; direction& #34 ;,   &#34;东&#34;]]

它回来了:

  

[&#34; north&#34;,&#34; south&#34;,&#34; east&#34;]

虽然,如果我将 y 的结果作为字符串打印到控制台,我会得到3个不包含在另一个数组中的独立数组(如下所示)。为什么它没有打印数组最外面的方括号 y

  

["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 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

如果您没有实例化Lexicon对象,则可以使用一个模块,它可以更清楚地表明您没有实例化对象。

此外,不需要使用额外的变量(即broken_words),并且我更喜欢{}> 块与迭代的do..end语法的{}块语法块。

module Lexicon
  def self.scan str
    str.split.map {|word| [ 'direction', word ] }
  end
end

更新:基于Cary的评论(我认为他说扫描时意味着分裂),我已经删除了多余的分裂论点。