将哈希与哈希分开[关闭]

问题描述 投票:-1回答:2

我有以下hash_of_student_and_grades。

{132=>{"Design"=>6, "English"=>5, "Humanities"=>5, "Languages"=>6, "Math"=>6, "Music"=>7,
 "PE"=>6, "Science"=>6, "Theatre"=>6}, 
134=>{"Design"=>7, "English"=>6, "Humanities"=>6, "Languages"=>6, "Math"=>5, "Music"=>6,
"PE"=>6, "Science"=>7, "Art"=>6}, 
136=>{"Design"=>5, "English"=>4, "Humanities"=>5, "Languages"=>6, "Math"=>6, "Music"=>6,
"PE"=>7, "Science"=>5, "Theatre"=>6},...}

现在我想用这样的密钥创建哈希。

id132={"Design"=>6, "English"=>5, "Humanities"=>5, "Languages"=>6, "Math"=>6, "Music"=>7,
 "PE"=>6, "Science"=>6, "Theatre"=>6}
id134={"Design"=>7, "English"=>6, "Humanities"=>6, "Languages"=>6, "Math"=>5, "Music"=>6,
"PE"=>6, "Science"=>7, "Art"=>6}
...
...

更新:

到目前为止我已经这样做了。但它不会将每个哈希分配给密钥。

resulthash.each {|key, value| puts key=value} 

# outputs
{"Design"=>6, "English"=>5, "Humanities"=>5, "Languages"=>6, "Math"=>6, "Music"=>7, "PE"=>6, "Science"=>6, "Theatre"=>6}
{"Design"=>7, "English"=>6, "Humanities"=>6, "Languages"=>6, "Math"=>5, "Music"=>6, "PE"=>6, "Science"=>7, "Theatre"=>6}

我怎么能做到这一点?

ruby hash
2个回答
1
投票

您不能将数字用作变量名,但如果它是id132,id133等,您可以使用元编程和实例变量来完成此操作:

hash = {"i1"=>{"a"=>"b"}, "i2"=>{"c"=>"d"}}
hash.each { |key, value| instance_variable_set("@#{ key }", value) }
puts @i1 # => {"a"=>"b"}

0
投票

因为你可以(红宝石让你有能力射击你的脚),这里是答案:

在ruby中,id32是变量的名称。 哈希的键可以是任何类型:数字,字符串......对象。基本类型(数字,字符串,nilfalsetrue)的评估方式如下:

n1 = 2
n2 = 2
h = {2 => 42}
h[n1] # 42
h[n2] # 42

换句话说,你得到/设置哈希的密钥2而不是n1n2。改变基本类型很难。

对象,另一方面,您可以修改:

class N
  def initialize name
    @name=name #contains name, like `id32`, `id34`
  end

  def to_s #this method let you show any text, here name(for example `id32`)
    "#{@name}" 
  end
end

id32 = N.new 'id32'

h={id32 => 42}
#{id32=>42}

#adding more keys/values

id34 = N.new 'id34'
h[id34] = 'some value'

而且...那只是基础知识。

什么很多的rubist做:

They use symbols.

What are symbols?

它的类型就像字符串,但只能有一个符号!

puts :a.object_id
puts :a.object_id
puts :a.object_id

上面的代码打印3相同的数字,因为:a只有1。

puts 'a'.object_id
puts 'a'.object_id

字符串不一样。

Construction:

你用:前缀字符:

`:a`

或者,如果它有奇怪的性格,前面加上:并用'"环绕:

:'a'

总结一下:

你的代码看起来完全一样,会更快(不需要像上面这样的对象):

h ={:a => :b}

或者从1.9.x(我不记得正确的数字)你也可以使用这种语法:

h = {a: :b}
© www.soinside.com 2019 - 2024. All rights reserved.