シンボルの配列を作成する


130

このようなことをするためのよりきれいな方法はありますか?

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

私は%s自分のやりたいことができたと思ったでしょうが、それはできませんでした。それは括弧の間のすべてを取り、それから一つの大きなシンボルを作ります。

ほんのささいな迷惑。


1
それはかなり標準的です。このメソッドを望ましくないものにする実装について何かありますか?
dwhalen 2009

5
「本当」ではありませんが、Railsにはこのような構文上の糖が含まれていることが多く、使用することで内部がすっきりと温かくなります。:)
ドリュー

ルビー2からあります。stackoverflow.com/questions/8816877/…を
m_x 2013年

回答:


357

元の回答は2011年9月に書かれましたが、Ruby 2.0以降、シンボルの配列を作成する短い方法があります。このリテラル:

%i[address city state postal country]

あなたが望むことを正確に行います。


3
それは「to_sym」の代わりに「インターン」を表すことをいつも忘れています。codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y

ruby 2の強調に注意してください。これは1.9.3までしかカバーしていないため、Rubyプログラミング言語の本には示されていません。
Donato

ルビーの%リテラル構文を使用する場合、角括弧の代わりに英数字以外の2つの文字を使用することを好みます。つまり、%i|a b c|
Epigene

6
これはあなたが望むことを行いますが、あなたのコードベースでこれを見た人は誰でも、Rubyが今回私たちに投げた奇妙な構文を理解するためにそれをグーグルする必要があります。[:address、:city、:state]のように、完全に読み取り可能な代替が存在する場合は、あいまいな言語機能を使用しないことを強くお勧めします。
Alex

ありがとう、これは本当に役に立ちます。
sonnyhe2002 2016

91

リテラルになりすぎるリスクがあるため、シンボルの配列を作成する最もクリーンな方法は、シンボルの配列を使用することだと思います。

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

それ以上簡潔なものは考えられません。


11
「文字通りすぎる」という意味ですか?
Andrew Grimm、

私は常に、最も強力で簡潔な方法を見つけて使用するのが好きです。この答えは、実際にはこの特定のリストの場合よりもキーストロークが少ないですが、9個以上のアイテムのリストがある場合、代替案は短くなります。答えてくれてありがとう。:)
ドリュー

4
この場合、読みやすさはすべてに勝ると思います。この答えは、%w / to_symの選択肢よりもはるかに読みやすい(IMO)です。次の開発者があなたの物を引き継ぐようにして、あなたを喉の奥まで突き刺そうとしないでください。
Bruce Hubbard

3

%i[ ] 空白で区切られた、補間されていないシンボルの配列(Ruby 2.0以降)

%I[ ] 空白で区切られた補間されたシンボルの配列(Ruby 2.0以降)

%i[address city state postal country]

これを行う最もクリーンな方法は次のとおりです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.