2

我花了几个小时寻找一种将数组推入另一个数组或散列的方法。如果这个问题的格式有点乱,请提前道歉。这是我第一次在 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

代替或返回:

[[“方向”,“北”],[“方向”,“南”],[“方向”,“东”]]

它回来了:

[“北”、“南”、“东”]

虽然,如果我将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

对此的任何反馈将不胜感激。提前非常感谢大家。

4

2 回答 2

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].

于 2014-11-21T15:42:37.677 回答
0

如果你没有实例化 Lexicon 对象,你可以使用一个 Module 可以更清楚地表明你没有实例化对象。

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

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

更新:根据卡里的评论(我假设他说扫描时他的意思是分裂),我已经删除了分裂的多余论点。

于 2014-11-21T16:10:01.870 回答