我正在尝试重新制作' mastermind',处理五个字母而不是颜色。
我有一个五个字母的单词,比方说"Alice"
,然后我将其分成一个名为answer_array
的数组。然后我提示用户输入一个五个字母的单词,然后将其分成guess_array
。我想比较guess_array
是否包含answer_array
中的任何相同字母,如果是,则会返回并提供适当的反馈。
这与我想要实现的目标一致:
guess_array.each { |x| puts guess_array[x] == answer_array[x]}
然而它回复了一条错误消息:
StringTest.rb:18:in `[]': no implicit conversion of String into Integer (TypeError)
from StringTest.rb:18:in `block in <main>'
from StringTest.rb:18:in `each'
from StringTest.rb:18:in `<main>'
答案 0 :(得分:0)
您可以使用&
(or set intersection) operator获取一个仅包含两个数组的公共元素的数组:
> [1, 2, 3] & [2, 3, 4]
=> [2, 3]
> [1,2,3] & [4,5,6]
=> []
如果您不需要返回实际的共享值,只需检查交叉点上的空白并获得布尔值:
> ([1,2,3] & [4,5,6]).any?
=> false
> ([1,2,3] & [3,5,6]).any?
=> true
关于您当前获得的错误:您的代码实际正在做的是迭代guess_array
中的每个元素,其中每次迭代时块中的内部变量x
为数组元素本身。 x
不是索引,它是您案例中的字符串值。看看:
> ['a', 'b', 'c'].each{ |s| puts s }
a
b
c
=> ["a", "b", "c"]
显然像my_array['a']
这样的东西不起作用。
如果您想同时使用值和索引进行迭代,可以调用each_with_index
:
> ['a','b','c'].each_with_index{ |s, i| puts "value is #{s} and index is #{i}" }
value is a and index is 0
value is b and index is 1
value is c and index is 2
=> ["a", "b", "c"]
这将允许您根据某些其他数组中的数组的当前索引执行查找。但对于您的特定问题,这可能不是最佳解决方案 - 使用集合交集。