在 Ruby 中将字符串转换为符号和整数的哈希值



我想将这种格式的任何给定字符串:a = "a=2, b=3, c=4, d=5"转换为符号(键(和整数(值(的哈希。

在这种情况下,预期输入{:a=>2, :b=>3, :c=>4, :d=>5}

这是我所拥有的:

def hash_it(str)
  str.split(", ").map{|s| s.split("=")}.to_h
end

hash_it(str)返回{"a"=>"2", "b"=>"3", "c"=>"4", "d"=>"5"} .接近,但不完全是。我不确定如何将键转换为符号并将值转换为整数。我可以单独转换它们:

str.split(", ").map{|s| s.split("=")}.map{|n| n[0].to_sym}
#=> [:a, :b, :c, :d]
str.split(", ").map{|s| s.split("=")}.map{|n| n[1].to_i}
#=> [2, 3, 4, 5]

但我不能为了预期的目的将它们放在一起。

如何将"a=2, b=3, c=4, d=5"格式的任何给定字符串转换为符号间键值{:a=>2, :b=>3, :c=>4, :d=>5}的哈希?

我可能会这样做:

str = "a=2, b=3, c=4, d=5"
str.scan(/(w+)=(d+)/).map {|k,v| [ k.to_sym, v.to_i ] }.to_h

scan只是提取每个键值对,其余的应该是不言自明的。

你们离得太近了!以下内容将稍微修复/扩展您的尝试:

a = "a=2, b=3, c=4, d=5"
def hash_it(str)
  str.split(", ").map{|s| s.split("=")}.map{|n| [n[0].to_sym, n[1].to_i]}.to_h
end
hash_it(a) #=> {:a=>2, :b=>3, :c=>4, :d=>5}

试试这个

String.class_eval do 
  def hashing
      self.split("#{oper1}").map{|s| [ s.split("#{oper2}")[0].strip.to_sym,s.split("#{oper2}")[1].to_i]}.to_h
  end
end

"你的字符串".哈希如果您希望它默认使用", =",而其他地方的其他人这样做

String.class_eval do 
  def hashing(oper1= ',', oper2= '=')
     self.split(oper1.to_s).map{|s| [ s.split(oper2.to_s)[0].strip.to_sym,s.split(oper2.to_s)[1].to_i]}.to_h
  end
end
"YOUR STRING ".hashing
#or 
"ANOTHER SRTING".hashing("|", "!") # for another split operators.

希望对您有所帮助。

def hashify(str)
  str.strip.split(/s*(?:=|,s)s*/).each_slice(2).map { |k,v| [k.to_sym, v.to_i] }.to_h
end
str = " a = 2, b=3 , c= 4, d =5 "
hashify str
  #=> {:a=>"2", :b=>"3", :c=>"4", :d=>"5"}

split操作为"在等号或逗号后跟空格上拆分,以及任何周围的空格"。

步骤如下。

s = str.strip
  #=> "a = 2, b=3 , c= 4, d =5"
a = s.split(/s*(?:=|,s)s*/)
  #=> ["a", "2", "b", "3", "c", "4", "d", "5"] 
e = a.each_slice(2)
  #=> #<Enumerator: ["a", "2", "b", "3", "c", "4", "d", "5"]:each_slice(2)> 

我们可以通过将此枚举器转换为数组来查看该枚举器将生成的值。

e.to_a
  #=> [["a", "2"], ["b", "3"], ["c", "4"], ["d", "5"]] 

继续

f = e.map { |k,v| [k.to_sym, v.to_i] }
  #=> [[:a, 2], [:b, 3], [:c, 4], [:d, 5]] 
f.to_h
  #=> {:a=>2, :b=>3, :c=>4, :d=>5}

最新更新