如何使用将字符串作为参数的方法,并将其转换为显示键的哈希:作为单词和值:作为单词出现在字符串中的次数?
def my_string(string)
end
my_string("This is my string, or could be any string.")
我原以为我必须string.split(" ")
并以某种方式使用数组。
def my_string(string)
string.split(" ")
string_hash = {}
string.each_with_index do |element, index|
string_hash[index] = element
end
end
my_string("This is my string, or could be any string.")
答案 0 :(得分:3)
def my_string(str)
str.downcase.scan(/[[:alpha:]]+/).each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }
end
str = "A cat, a dog and another cat."
my_string str
#=> {"a"=>2, "cat"=>2, "dog"=>1, "and"=>1, "another"=>1}
这使用类方法Hash::new的形式,它接受一个默认值的参数。这只是意味着如果哈希h = Hash.new(d)
没有密钥k
,h[k]
会返回默认值d
,此处为0
。 (散列不会改变。)
步骤如下。
s = str.downcase
#=> "a cat, a dog and another cat."
a = s.scan(/[[:alpha:]]+/)
#=> ["a", "cat", "a", "dog", "and", "another", "cat"]
e = a.each_with_object(Hash.new(0))
#=> #<Enumerator: ["a", "cat", "a", "dog", "and", "another", "cat"]:
# each_with_object({})>
第一个值由枚举器生成并传递给块,块变量s
和h
被赋值。
s,h = e.next
#=> ["a", {}]
s #=> "a"
h #=> {}
h[s] += 1
# h["a"] = h["a"] + 1 => h["a"] = 0 + 1 => h["a"] = 1
当Ruby看到h["a"] += 1
时(解析时),她所做的第一件事就是将其扩展为h["a"] = h["a"] + 1
。由于h
最初为空(因此没有键"a"
),因此等式右侧的h["a"]
会返回默认值0
。接着,
s,h = e.next
#=> ["cat", {"a"=>1}]
s #=> "cat"
h #=> {"a"=>1}
h[s] += 1
# h["cat"] = h["cat"] + 1 => h["cat"] = 0 + 1 => h["cat"] = 1
s,h = e.next
#=> ["a", {"a"=>1, "cat"=>1}]
s #=> "a"
h #=> {"a"=>1, "cat"=>1}
h[s] += 1
# h["a"] = h["a"] + 1 => h["a"] = 1 + 1 => h["a"] = 2
h #=> {"a"=>2, "cat"=>1}
此时h
有一个键"a"
,因此等式右侧的h["a"]
会返回该键的值1
。
其余步骤类似。