我正在关注在Ruby中构建一个hangman应用程序的教程。它有一个隐藏单词的功能伪装,它只是从文件导入的国家/地区名称。问题是我不明白这实际上是如何伪装这些词,或三元运算符如何在注入中工作。它检查字符是否为空白(即“”),如果是,则将其设置为空白(即“”),但如果不是,则将其设置为& nbsp。该功能似乎没有处理这些单词具有实际字符即字母的事实。
任何人都可以解释这种菜鸟,我误解了什么?另外,为什么它会在结束时(结束前)再次添加“伪装”?
def masquerade(word)
word.each_char.inject([]) { |disguise, char| disguise << (char == " " ? " " : " "); disguise }
end
游戏词的例子
Afghanistan
Albania
Algeria
Andorra
Angola
Antigua & Deps
Argentina
Armenia
整个Word课程
class Word
class << self
def get_random
content = File.read("countries.txt")
words = content.split("\n")
words[rand(words.size)].upcase
end
def masquerade(word)
word.each_char.inject([]) { |disguise, char| disguise << (char == " " ? " " : " "); disguise }
end
def reveal(last_revealed_word, char_clicked, final_word)
chars = final_word.each_char.to_a
last_revealed_word.each_index do |i|
last_revealed_word[i] = chars[i] if last_revealed_word[i] == " " and chars[i] == char_clicked
end
end
def chars_left(revealed_word)
revealed_word.count { |c| c == " " }
end
end
end
答案 0 :(得分:1)
不需要在末尾添加disguise
。 <<
已经更改了对象。
你可以看到没有区别:
[1] pry(main)> "wor d".each_char.inject([]) { |d, c| d << ( c == " " ? " " : " "); d }
=> [" ", " ", " ", " ", " "]
[2] pry(main)> "wor d".each_char.inject([]) { |d, c| d << ( c == " " ? " " : " ") }
=> [" ", " ", " ", " ", " "]
upd:这里屏蔽是用不间断的空格替换字符
答案 1 :(得分:1)
让我们假设word ='Albania'。 word.each_char返回一个Enumerable对象,其中每个“item”是单词中的一个字母。
想象一下使用#each而不是#inject
word.each_char.each { |letter| puts letter }
A
l
b
...
#inject用于获取可枚举中的所有项目,并以某种方式组合它们。在这种情况下,它们被组合成的东西是一个数组。你可以告诉我,因为在.inject([])中传递一个空数组作为参数注入;它也可能是注入(Array.new)。无论传入的是什么,它都将成为注入“备忘录”的默认值,它是用于跟踪最终结果的对象,因为它正在通过项目。在这种情况下,该备忘录对象称为伪装。
在注入循环期间,伪装备忘录将从一次迭代转移到下一次迭代。每次迭代都将处理注入被调用的可枚举项中的一个项(字母)。在块内,该项称为char。
无论块返回什么,都会成为下一次注入迭代的备忘录(伪装)的新值。
所以在这里,第一次迭代将伪装= []和char ='A'。 if / else表示“如果char是单个空格,则向伪装数组附加一个空格,否则,将不间断空格附加到伪装数组。
Array#push()(这是&lt;&lt;正在执行此处)的结果是推送新项目后的数组。所以,如果你有[1,2] .push(3),则返回[1,2,3]。在这种注入的情况下,他们希望将推送的结果带到下一次迭代,所以基本上通过伪装来确保数组是块返回的内容;在末尾。就像现在一样,没有必要。如果在块的推送和结束之间发生了一些其他操作,则需要显式返回伪装数组,否则第二个操作的结果将存储在备忘录中。
至于if / else如何处理单词的字母,基本上任何时候它都是一个字母,它放在&amp; nbsp字符串中。
因此,在第一次迭代中,char ='A'不是单个空格,因此将被推入空数组,并且该块返回该数组[“&amp; nbsp”]。伪装现在等于[“&amp; nbsp”]。在第二次迭代中,char ='l',也不是空格,因此另一个&amp; nbsp被推到数组上,变成[“&amp; nbsp”,“&amp; nbsp”]。这是块的结果和第三次迭代中的伪装值。
注入将继续像所有字母一样,然后返回伪装的最终值。
在大多数情况下,这会导致[“&amp; nbsp”,“&amp; nbsp”,“&amp; nbsp”等],或者如果国家/地区名称中包含空格,您将获得[“&amp; nbsp”在没有看到结果数组如何在视图中使用或呈现给某些用户的情况下,很难说明这一点是什么意思。方式。