Ruby:注入中的三元运算符
我将跟随一个教程,在Ruby中构建一个hangman应用程序。它有一个隐藏单词的伪装函数,这个单词只是从文件中导入的国家名称。问题是我不明白这实际上是如何隐藏单词的,或者三元运算符在inject中是如何工作的。它检查字符是否为空(即“”),如果为空,则将其设置为空(即“”),如果为空,则将其设置为空。该函数似乎没有处理单词具有实际字符(即字母)的事实 有人能解释我的误解吗?另外,为什么它在结尾(在结束之前)再次添加“伪装”Ruby:注入中的三元运算符,ruby,Ruby,我将跟随一个教程,在Ruby中构建一个hangman应用程序。它有一个隐藏单词的伪装函数,这个单词只是从文件中导入的国家名称。问题是我不明白这实际上是如何隐藏单词的,或者三元运算符在inject中是如何工作的。它检查字符是否为空(即“”),如果为空,则将其设置为空(即“”),如果为空,则将其设置为空。该函数似乎没有处理单词具有实际字符(即字母)的事实 有人能解释我的误解吗?另外,为什么它在结尾(在结束之前)再次添加“伪装” def masquerade(word) word.eac
def masquerade(word)
word.each_char.inject([]) { |disguise, char| disguise << (char == " " ? " " : " "); disguise }
end
整个单词类
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
类字
类不需要在末尾添加伪装。该
已更改对象。/p
p您看不出有什么不同:/p
预编码[1]pry(main)“word”。每个字符注入([]){d,c | d<(c==“”?“”:“”);d}
= [" ", " ", " ", " ", " "]
[2] pry(main)>“word”。每个字符注入([]){d,c | d[“”,“”,“”,“”,“”,“”,“”,“”]
upd:这里的屏蔽是用不间断空格替换字符让我们假设word='albana'。word.each_char返回一个可枚举对象,其中每个“项”都是单词中的一个字母
想象一下使用#each而不是#inject
#inject意味着获取一个枚举中的所有项,并以某种方式组合它们。在这种情况下,它们组合成的是一个数组。可以看出这一点,因为一个空数组作为参数在.inject([])中传递给inject;它也可以是inject(array.new)。传入的任何内容都将是注入的“memo”的默认值,该对象用于跟踪通过项目时的最终结果。在这种情况下,该memo对象称为伪装
在inject循环期间,伪装备忘录将从一个迭代转到下一个迭代。每个迭代将处理调用inject的可枚举项中的一个项(字母)。在块内,该项称为char
块返回的任何内容都将成为下一次注入迭代的memo(伪装)的新值
因此,在这里,第一次迭代将有converge=[]和char='A'。if/else表示“如果char是单个空间,则将单个空间附加到converge数组,否则,将非中断空间附加到converge数组
数组#push()的结果(这就是它所说的,如果它不是一个空格,用一个不间断的空格替换它。这个事实在chars_left
和discover
中使用。注意,有些人更喜欢新的ish带有索引的每个_
而不是注入
,并附加返回注入的对象。好的,明白了。所以字母将l被 替换为什么它在结尾处的分号后再次添加伪装?因此inject
将起作用;inject
希望块返回被注入的对象。这就是为什么它对功能人员有点冒犯,以及为什么每个带有对象的对象都被发明出来。
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
[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 == " " ? " " : " ") }
=> [" ", " ", " ", " ", " "]
word.each_char.each { |letter| puts letter }
A
l
b
...