2017-02-19 37 views
0

我想在下面的示例中调用一组元素。Ruby:使用字符串变量调用数组元素集不起作用

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不会得到我的结果,就应该拿出相同的同变量称为正确?

帮助,将不胜感激:)

回答

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] 

如果您安装了宝石activesupport,然后require active_support/all(这在轨自动完成),这是关于你需要使用哪个键不太严格:

days_all = days_all.with_indifferent_access 
days_all["thursday"] 
days_all[:thursday] 
days_all.thursday 
+0

谢谢你做到了:) 对不起, – vinnym342

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如果你不介意你的间隔之间差距的值。这些很容易比较:由于ASCII分类问题,1130<230永远不会突然变为真。