关于Hash的Ruby练习

时间:2015-12-22 01:26:47

标签: ruby

我正在进行这项Ruby练习:

  

编写一个带字符串的函数letter_count(str)   返回将每个字母映射到其频率的哈希值。不包括在内   空格。

这是一个解决方案:

def letter_count(str)
  counts = Hash.new(0)
  str.each_char do |char|
    counts[char] += 1 unless char == " "
  end
  counts
end

counts[char] += 1是什么意思? char == " "是什么意思?

3 个答案:

答案 0 :(得分:3)

  

世界上有什么计算[char] + = 1意味着什么?

count = counts[char] # retrieve the value at index "char" count = count + 1 # add one counts[char] = count # set the value at index "char" to the new value 是"递增和分配"的简写,即可以写成:

==
  

还有什么是char ==" "意思?

a == b是相等运算符。如果truea具有相同的值,则b会返回char == " "。因此char如果unless是空格字符,则返回true。在这种情况下,等式测试由尾随NSLog反转,因此它最终意味着"为该字符的计数加1,除非该字符是空格"。

答案 1 :(得分:2)

在Ruby中,+=去了=+。因此counts[char] += 1变为counts[char] = counts[char] + 1。现在,通常,如果散列中不存在键,则散列访问方法[]将返回nil,这就是我们将0传递给构造函数的原因。将值传递给构造函数会使'默认值为'如果某个键不存在则返回值。因此,如果counts[char]存在,则会向其添加一个,如果不存在,则会将其初始化为0 + 1,这只是1。

至于最后的比较,unless char == " "是一个后缀条件,一个迁移到Ruby的Perlism。在Ruby中,您可以在一行的末尾写条件,因此以下三个是等效的。

# One
if not foo
  bar
end
# Two
bar if not foo
# Three
bar unless foo

问题描述说要排除空格,所以unless char == " "确保散列中的增量操作将运行,除非该字符是空格。

答案 2 :(得分:1)

  

世界上有什么计算[char] + = 1意味着??

a += 1a = a + 1是等效的。此外,使用counts = Hash.new(0)0将设置为新密钥的值(如果密钥不退出)。因此,如果char是新的,counts[char]将成为1 counts[char] += 1。如果它是第二次看到charcounts[char]成为2 counts[char] += 1,因为1已经设置为counts[char]

  

Alsowhat做char ==" "意思?

如果char == " "为"

char则返回true "(空格字符)。