我花了几个小时搜索将数组推入另一个数组或哈希的方法。如果这个问题的格式有点混乱,请提前道歉。这是我第一次在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
对此的任何反馈都将非常感激。非常感谢你们。
答案 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的评论(我认为他说扫描时意味着分裂),我已经删除了多余的分裂论点。