Arrays Ruby:使用字符串变量调用数组元素集不起作用
我试图在下面的示例中调用一组元素Arrays Ruby:使用字符串变量调用数组元素集不起作用,arrays,ruby,string,hash,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 = movi
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或var3不能得到我的结果,它应该是相同的,同一个变量叫做right
非常感谢您的帮助:不,符号和字符串之间有区别,它们并不总是可以互换的。符号与以冒号开头的字符串不同,冒号仍然是字符串。使用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,然后需要active\u支持/所有这些都是在rails中自动完成的,那么您需要使用什么密钥就不那么严格了:
days_all = days_all.with_indifferent_access
days_all["thursday"]
days_all[:thursday]
days_all.thursday
不,符号和字符串之间有区别,它们并不总是可以互换的。符号与以冒号开头的字符串不同,冒号仍然是字符串。使用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,然后需要active\u支持/所有这些都是在rails中自动完成的,那么您需要使用什么密钥就不那么严格了:
days_all = days_all.with_indifferent_access
days_all["thursday"]
days_all[:thursday]
days_all.thursday
对于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
另一件需要注意的事情是,如果可以避免的话,您可能不想坚持使用这种数据结构。这不是机器可读的,像:星期四这样的名字完全是随意的。最好使用一致的索引,如0表示星期天,1表示星期一等。这样,可以使用类似的函数在常规数组中查找内容
同样的情况也适用于人工标注的时间,比如10:30pm,其中1350表示22小时加30分钟,如果你不介意间隔之间的间隙,甚至2230。这些很容易比较:1130与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
另一件需要注意的事情是,如果可以避免的话,您可能不想坚持使用这种数据结构。这不是机器可读的,像:星期四这样的名字完全是随意的。最好使用一致的索引,如0表示星期天,1表示星期一等。这样,可以使用类似的函数在常规数组中查找内容
同样的情况也适用于人工标注的时间,比如10:30pm,其中1350表示22小时加30分钟,如果你不介意间隔之间的间隙,甚至2230。这些很容易比较:1130做了这件事的感谢:很抱歉回复太晚。做了这件事的感谢:很抱歉回复太晚