Ruby:注入中的三元运算符

Ruby:注入中的三元运算符,ruby,Ruby,我将跟随一个教程,在Ruby中构建一个hangman应用程序。它有一个隐藏单词的伪装函数,这个单词只是从文件中导入的国家名称。问题是我不明白这实际上是如何隐藏单词的,或者三元运算符在inject中是如何工作的。它检查字符是否为空(即“”),如果为空,则将其设置为空(即“”),如果为空,则将其设置为空。该函数似乎没有处理单词具有实际字符(即字母)的事实 有人能解释我的误解吗?另外,为什么它在结尾(在结束之前)再次添加“伪装” def masquerade(word) word.eac

我将跟随一个教程,在Ruby中构建一个hangman应用程序。它有一个隐藏单词的伪装函数,这个单词只是从文件中导入的国家名称。问题是我不明白这实际上是如何隐藏单词的,或者三元运算符在inject中是如何工作的。它检查字符是否为空(即“”),如果为空,则将其设置为空(即“”),如果为空,则将其设置为空。该函数似乎没有处理单词具有实际字符(即字母)的事实

有人能解释我的误解吗?另外,为什么它在结尾(在结束之前)再次添加“伪装”

def masquerade(word)

      word.each_char.inject([]) { |disguise, char| disguise << (char == " " ? " " : "&nbsp;"); 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 == " " ? " " : "&nbsp;"); 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] == "&nbsp;" and chars[i] == char_clicked
      end
    end

    def chars_left(revealed_word)
      revealed_word.count { |c| c == "&nbsp;" }
    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 == " " ? " " : "&nbsp;"); 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] == "&nbsp;" and chars[i] == char_clicked
      end
    end

    def chars_left(revealed_word)
      revealed_word.count { |c| c == "&nbsp;" }
    end

  end

end
[1] pry(main)> "wor d".each_char.inject([]) { |d, c| d << ( c == " " ? " " : "&nbsp;"); d }
=> ["&nbsp;", "&nbsp;", "&nbsp;", " ", "&nbsp;"]

[2] pry(main)> "wor d".each_char.inject([]) { |d, c| d << ( c == " " ? " " : "&nbsp;") }
=> ["&nbsp;", "&nbsp;", "&nbsp;", " ", "&nbsp;"]
word.each_char.each { |letter| puts letter }
A
l
b
...