Ruby:注入中的三元运算符

时间:2012-10-02 20:17:07

标签: ruby

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

任何人都可以解释这种菜鸟,我误解了什么?另外,为什么它会在结束时(结束前)再次添加“伪装”?

def masquerade(word)

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

2 个答案:

答案 0 :(得分:1)

不需要在末尾添加disguise<<已经更改了对象。

你可以看到没有区别:

[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;"]

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”在没有看到结果数组如何在视图中使用或呈现给某些用户的情况下,很难说明这一点是什么意思。方式。

  • 我删除了;从那以后他们就会出现。