Ruby 如何使用将字符串作为参数的方法,并将其转换为哈希?

Ruby 如何使用将字符串作为参数的方法,并将其转换为哈希?,ruby,hash,Ruby,Hash,如何使用一个将字符串作为参数的方法,并将其转换为显示关键字的哈希值:作为单词和值:作为单词在字符串中出现的次数 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.eac

如何使用一个将字符串作为参数的方法,并将其转换为显示关键字的哈希值:作为单词和值:作为单词在字符串中出现的次数

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.")
这使用类方法的形式,该类方法接受默认值的参数。这仅仅意味着如果散列
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({})>
当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

其余步骤类似

这使用类方法的形式,该类方法接受默认值的参数。这仅仅意味着如果散列
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({})>
当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


其余步骤类似。

您为此编写的代码在哪里?代码的输出是什么?到底是什么不起作用?到目前为止我还没走多远。我想看看是否有新的方法可以做到这一点。另一种方法是
string.split.group\u by(&:itself)。transform\u values(&:size)
只有当transform\u values存在时,这个解决方案才有效,这只适用于ruby 2.4+。而且,如果你的文件中有特殊字符,它也不会排除这些特殊字符。你为此编写的代码在哪里?代码的输出是什么?到底是什么不起作用?到目前为止我还没走多远。我想看看是否有新的方法可以做到这一点。另一种方法是
string.split.group\u by(&:itself)。transform\u values(&:size)
只有当transform\u values存在时,这个解决方案才有效,这只适用于ruby 2.4+。此外,它不会排除特殊字符(如果有)。最后,一个适用于21世纪的正则表达式:)
Enumerable#count_by
确实是一个缺失的部分(为什么是
split
而不是
scan
?后者似乎更合适,从意图上看。@Sergio,对
scan
(已编辑)是的。你应该建议将
Enumerable#count_by
添加到Ruby内核中。恐怕他们需要一些代码,而且我对C不太精通。:/最后,一个适合21世纪的正则表达式:)
可枚举的#count_by
确实是一个缺失的部分:(为什么是
split
而不是
scan
?后者似乎更合适,出于意图。@Sergio,是的,关于
scan
(已编辑)。你应该建议将
Enumerable#count_by
添加到Ruby内核中。恐怕他们需要一些代码,而我对C不太精通:/