创建符号数组


130

有没有更清洁的方式来做这样的事情?

%w[address city state postal country].map(&:to_sym) 
#=> [:address, :city, :state, :postal, :country]

我本以为%s可以完成我想要的,但事实并非如此。它只是将方括号之间的所有内容都包含在内,并因此而成为一个大符号。

只是一个小麻烦。


1
这是很标准的。您的实现中有什么使该方法不受欢迎的吗?
dwhalen 2011年

5
不是“真的”,而是Rails经常有这样的语法糖,这使我通过使用感到内心有些温暖。:)
提请

由于红宝石2,有!看到stackoverflow.com/questions/8816877/...
m_x

Answers:


357

最初的答案写在11年9月,但是从Ruby 2.0开始,有一种较短的方法来创建符号数组!这个文字:

%i[address city state postal country]

将完全按照您想要的去做。


3
我总是忘记了它代表“ intern”替代“ to_sym”。参见codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y 2014年

请注意ruby 2的重点。在Ruby Programming Language一书中没有显示它,因为它最多涵盖1.9.3。
多纳托2015年

当使用ruby的%文字语法时,我更喜欢使用两个非字母数字字符代替方括号,即%i|a b c|
Epigene

6
尽管这可以满足您的要求,但是在您的代码库中看到此内容的任何人都必须向Google询问,这是Ruby这次给我们抛出的奇怪语法。我强烈建议您在存在完全可读的替代方法(例如[:address,:city,:state])时避免使用晦涩的语言功能。
Alex

谢谢,这真的很有帮助。
sonnyhe2002

91

冒着过于文字化的风险,我认为构造符号数组的最干净方法是使用符号数组。

fields = [:address, :city, :state, :postal, :country]

没有比这更简洁的了。


11
你的意思是“太字面意思”吗?
安德鲁·格林

我一直喜欢寻找和使用最强大,最简洁的做事方式。对于该特定列表,此答案实际上比我的要少击键,但是列表中有〜9个或更多项目,则替代方法会更短。感谢你的回答。:)
提请

4
我认为在这种情况下可读性胜过一切。这个答案比%w / to_sym更具可读性(IMO)。不要让下一个要接管您的工作的开发人员想要打扰您。
布鲁斯·哈伯德

3

%i[ ] 非插值符号数组,用空格分隔(在Ruby 2.0之后)

%I[ ] 插入的符号数组,用空格分隔(在Ruby 2.0之后)

%i[address city state postal country]

最干净的方法是:

%w[address city state postal country].map(&:to_sym)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.