Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么在使用/W拆分字符串时会生成空格_Ruby - Fatal编程技术网

Ruby 为什么在使用/W拆分字符串时会生成空格

Ruby 为什么在使用/W拆分字符串时会生成空格,ruby,Ruby,我正试着把一根绳子劈开,以便弄清楚上面的字 我的代码如下: def words(string) string.downcase! hash_str = Hash.new string.split(/\W/i).each {|y| if(hash_str.has_key?(y)) hash_str[y] += 1 else hash_str[y] =1 end } return h

我正试着把一根绳子劈开,以便弄清楚上面的字

我的代码如下:

def words(string)
    string.downcase!
    hash_str = Hash.new
    string.split(/\W/i).each {|y| 
      if(hash_str.has_key?(y)) 
         hash_str[y] += 1
      else 
         hash_str[y] =1
      end
    }
    return hash_str
end

hash_t = words("A man, a plan, a canal -- Panama")
hash_t.each{|x,y| puts "#{x}:#{y}"}
输出为:

1    :5
2   a:3  
3  plan:1
4  man:1
5  canal:1
6  panama:1
我的问题是,似乎空白也被计算在内。 如何添加空白


谢谢。

当两个或多个非单词字符相邻时,将出现空白字符串条目

因此,
“一个人,一个”
在空格处分开,得到
“一个”
“一个人,一个”
;然后在逗号处给出“man”和“a”,然后在空格处再次给出“man”和“a”

如果使用
split(/\W+/i)
,您将得到预期的结果,因为它将把每个非单词字符字符串视为一个单独的拆分


空白字符串条目出现在两个或多个非单词字符相邻的地方

因此,
“一个人,一个”
在空格处分开,得到
“一个”
“一个人,一个”
;然后在逗号处给出“man”和“a”,然后在空格处再次给出“man”和“a”

如果使用
split(/\W+/i)
,您将得到预期的结果,因为它将把每个非单词字符字符串视为一个单独的拆分


一种更具红宝石色彩的解决方案:

str = "A man, a plan, a canal -- Panama"
str.downcase.split(/\W+/).inject(Hash.new(0)) { |h,v| h[v] += 1; h }

=> {"plan"=>1, "a"=>3, "panama"=>1, "man"=>1, "canal"=>1}

更具红宝石风格的解决方案:

str = "A man, a plan, a canal -- Panama"
str.downcase.split(/\W+/).inject(Hash.new(0)) { |h,v| h[v] += 1; h }

=> {"plan"=>1, "a"=>3, "panama"=>1, "man"=>1, "canal"=>1}

在这种情况下,使用
scan
在概念上更为自然。此用例的典型实现如下所示:

def words(string)
  Hash.new(0).tap{|h| string.downcase.scan(/\w+/){|w| h[w] += 1}}
end

words("A man, a plan, a canal -- Panama").each{|x,y| puts "#{x}:#{y}"}
这将使:

a:3
man:1
plan:1
canal:1
panama:1

在这种情况下,使用
scan
在概念上更为自然。此用例的典型实现如下所示:

def words(string)
  Hash.new(0).tap{|h| string.downcase.scan(/\w+/){|w| h[w] += 1}}
end

words("A man, a plan, a canal -- Panama").each{|x,y| puts "#{x}:#{y}"}
这将使:

a:3
man:1
plan:1
canal:1
panama:1

也许你可以尝试使用
split(/\b/)
对我有用<代码>散列是
{“a”=>3,“man”=>1,“plan”=>1,“canal”=>1,“panama”=>1}
。你在用什么Ruby?我在用这个->哦,我以为你在抱怨
a:3
之前的空格。我只是不知道为什么会有:5可能你可以尝试使用
split(/\b/)
对我有效<代码>散列是
{“a”=>3,“man”=>1,“plan”=>1,“canal”=>1,“panama”=>1}
。你在用什么Ruby?我在用这个->哦,我以为你在抱怨
a:3
之前的空格。这是缺席。我只是不知道为什么有:5哦。。。我从来没想过“”也算在内。谢谢。哦。。。我从来没想过“”也算在内。谢谢,这是一个干净的密码。。我想我还不习惯Ruby.:)谢谢:)@newbie不客气。请注意,您可以跳过代码中的
has_key?
业务,因为您可以使用
new
构造函数创建默认值为0的
哈希。new(0)
@newbie
inject
(方法链中的最后一个方法)始终返回其处理的最后一个值,这是本例中的
散列(
h
)实际上我不理解你的代码。。。它是如何确定h是hashmap,v是值的??。。。那为什么最后会有一个h?请解释一下。谢谢。请参阅
inject
的文档。你用一个初始值调用它,在本例中是散列,然后它用这个初始值和我们刚刚拆分的数组中的对象调用你的块。对于每个循环,您必须将希望在下一轮中使用的
memo
对象返回给它。这是结尾的
h
。这是一个干净的代码。。我想我还不习惯Ruby.:)谢谢:)@newbie不客气。请注意,您可以跳过代码中的
has_key?
业务,因为您可以使用
new
构造函数创建默认值为0的
哈希。new(0)
@newbie
inject
(方法链中的最后一个方法)始终返回其处理的最后一个值,这是本例中的
散列(
h
)实际上我不理解你的代码。。。它是如何确定h是hashmap,v是值的??。。。那为什么最后会有一个h?请解释一下。谢谢。请参阅
inject
的文档。你用一个初始值调用它,在本例中是散列,然后它用这个初始值和我们刚刚拆分的数组中的对象调用你的块。对于每个循环,您必须将希望在下一轮中使用的
memo
对象返回给它。这就是结尾的
h