我正在尝试在下面的示例中调用一组元素。
session_times: {
thursday: ["10:20am", "12:30pm", "6:40pm"],
friday: ["10:20am", "12:30pm", "6:40pm"],
saturday: ["10:20am", "12:30pm", "6:00pm"],
sunday: ["10:20am", "12:30pm", "6:30pm"]
}
我尝试过以下功能
days_all = movie[:session_times]
string = ':' + 'thursday'
var1 = days_all[:thursday]
var2 = days_all["#{string}"]
var3 = days_all[string]
变量var1完全没问题,但是我不明白为什么var2或var 3不会得到我的结果,它应该与同一个变量相同,称为对吗?
非常感谢帮助:)
答案 0 :(得分:3)
不,符号和字符串之间存在差异,并且它们并不总是可互换的。符号与以冒号开头的字符串不同(它仍然是一个字符串)。当您使用key: val
哈希语法时,键是符号; "key" => val
将是一个字符串键。
其中任何一个都可行:
string = "thursday" # don't put the colon in here
days_all[:"#{string}"]
days_all[string.to_sym]
days_all["#{string}".to_sym]
如果您安装了gem activesupport
然后require active_support/all
(这是在rails中自动完成的),那么您对需要使用的密钥不太严格:
days_all = days_all.with_indifferent_access
days_all["thursday"]
days_all[:thursday]
days_all.thursday
答案 1 :(得分:1)
Ruby :x
表示符号,"x"
表示字符串。符号是一个"内化字符串",它更像是一个任意常量,:x
的每个实例都是相同的,它们实际上是同一个对象。
对于字符串也是如此,每个字符串可能不同,并且通常占用不同的内存块。这就是为什么你看到用于哈希键的符号,否则它们的重复会浪费。
您可以通过以下任何方式参考您的结构:
days_all[:thursday] # With a plain symbol
days_all["thursday".to_sym] # With a converted string
days_all[:"thursday"] # With a long-form symbol
另外需要注意的是,如果可以避免,可能不想坚持使用这种数据结构。这不是机器可读的,像:thursday
这样的名字完全是任意的。使用像0
这样的一致索引意味着星期日,1
意味着星期一等等,这样会好得多。这样,cwday
之类的函数可用于在常规数组中查找内容。
对于像"10:30pm"
这样的人类注释时间也是如此,其中像1350
这样的值意味着22小时加30分钟,如果你不介意之间的差距2230
你的间隔。这些很容易比较:1130<230
由于ASCII排序问题而永远不会突然变为现实。