.each_with_object红宝石的解释?

use*_*867 2 ruby hash

下面,我们给出一个名为win_lose的数组.我们应该创建一个看起来像下面的哈希的哈希.我最初的倾向是使用.count做一些事情,但在尝试答案之后,.each_with_object工作得最好.

有人可以根据.each_with_object方法做什么以及答案本身为我分解吗?我得到了答案并从阅读文档中找到了答案,但仍然需要解释方法本身...

谢谢!

win_lose = ["win", "lose", "win", "lose", "win", "win"]
Run Code Online (Sandbox Code Playgroud)

基于win_lose数组创建一个如下所示的哈希:

 win_loss_count = {
   "win" => 4,
   "loss" => 2
 }
Run Code Online (Sandbox Code Playgroud)

这是我最初尝试没有成功的原因:

win_loss_count = Hash[win_lose.map.with_index { |outcome, times| outcome = times.count }]
Run Code Online (Sandbox Code Playgroud)

回答:

win_loss_count = win_lose.each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }
Run Code Online (Sandbox Code Playgroud)

Nic*_*eys 6

each_with_object它的字面意思非常简洁.它就像each,但每次都有一个额外的物体.

所以对此:

win_lose.each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }
Run Code Online (Sandbox Code Playgroud)

你每次都在调用each通过Hash.new(0)传入创建的对象. word是你在正常情况下得到的词each,counts是被称为"with_object"的"对象"(所以,哈希).

这个快捷方式的重点是Hash.new(0).这意味着创建一个新的空哈希值,其中0表示以前不存在的所有键的值,这使得counts[word] += 1即使它之前不存在也可以执行.

最后,each_with_object返回"对象",因此counts返回,已针对每个单词进行了修改.

  • 谢谢尼克这个彻底的解释.我现在明白了! (2认同)