Ruby:使用字符串变量来调用数组元素集是行不通的

时间:2017-02-19 04:57:07

标签: arrays ruby string hash

我正在尝试在下面的示例中调用一组元素。

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不会得到我的结果,它应该与同一个变量相同,称为对吗?

非常感谢帮助:)

2 个答案:

答案 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排序问题而永远不会突然变为现实。