%w(array)はどういう意味ですか?


836

FileUtilsのドキュメントを見ています。

次の行で混乱しています。

FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'

どういう%w意味ですか?ドキュメントを教えてもらえますか?

回答:


1245

%w(foo bar)のショートカットです["foo", "bar"]。つまり、コンマの代わりにスペースで区切られ、引用符で囲まれていない文字列の配列を記述する表記法です。あなたはzenspiderのquickrefでリテラルを書く方法のリストを見つけることができます。


199
また、かっこは、角かっこ%w [...]、中かっこ%w {...}、感嘆符%w!...!などのほとんどすべての文字にすることができます。これらはすべて同じ動作です(配列を返す)。
ryanb 2009

143
これが何を意味するのかを覚えておく最も簡単な方法は、「空白(w)で区切られた配列」です。
Julik、2009

7
ここでは、「一般的な区切りの入力」を参照してください。ruby-doc.org/docs/ProgrammingRuby/html/language.html
ジャレド・ベック

121
文字列にスペースがある場合は、\でエスケープします。例:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy

6
:このページは、あまりにも疑問、解決しているだろうと思いますruby-doc.org/core-2.0/doc/syntax/...
TheConstructor

471

%w()は「単語の配列」と考えています-要素はスペースで区切られ、文字列の配列を返します。

他に%リテラルがあります:

  • %r() 正規表現を記述するもう1つの方法です。
  • %q() 単一引用符で囲まれた文字列を書くもう1つの方法です(複数行にすることもでき、便利です)。
  • %Q() 二重引用符で囲まれた文字列を与える
  • %x() シェルコマンドです
  • %i() シンボルの配列を与える(Ruby> = 2.0.0)
  • %s()foo記号に変わります(:foo

他には知りませんが、そこに潜んでいる人がいるかもしれません...


32
Ruby 2.0.0以降%i()では、シンボルの配列の生成にも使用できます。
David Tuite

10
のように、二重引用符で囲まれた文字列を与え、二重引用符をエスケープする%()(または%[]or %{})もあり%Q()ます。例%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
デニス

59

%sたとえば、次のようなシンボルを作成することもできます。

%s|some words|          #Same as :'some words'
%s[other words]         #Same as :'other words'
%s_last example_        #Same as :'last example'

Ruby 2.0.0以降:

%i( a b c )   # => [ :a, :b, :c ]
%i[ a b c ]   # => [ :a, :b, :c ]
%i_ a b c _   # => [ :a, :b, :c ]
# etc...


22

古い投稿ですが、質問が増え続け、答えがいつもはっきりとは分かりません。そこで、私の考えは次のとおりです。

%wおよび%W一般的な区切られた入力タイプの例です、配列に関連する。含む他の種類があり%q%Q%r%xとは%i

大文字と小文字のバージョンの違いは、単一引用符と二重引用符の機能にアクセスできることです。一重引用符と(小文字)%wを使用すると、コード補間はありません(#{someCode})、機能するエスケープ文字の範囲が限定されます(\\\n)。二重引用符と(大文字)で%W、我々はない、これらの機能へのアクセス権を持っています。

使用される区切り文字は、左括弧だけでなく、任意の文字にすることができます。上記の例を試して、効果があることを確認してください。

完全な例%wと完全なリスト、エスケープ文字と区切り文字を使った完全な記事については、「Ruby-%wと%Wの比較-秘密が明らかになった!」をご覧ください


17

代わりに%w()私たちが使用する必要があります%w[]

Rubyスタイルガイドによると:

単語の配列(スペースや特殊文字を含まない空でない文字列)が必要な場合は、リテラル配列構文より%wを優先してください。このルールは、2つ以上の要素を持つ配列にのみ適用します。

# bad
STATES = ['draft', 'open', 'closed']

# good
STATES = %w[draft open closed]

さまざまな種類のパーセントリテラルに最も適した中括弧を使用します。

[]配列リテラル(%w, %i, %W, %I)は、標準の配列リテラルと揃えられるため。

# bad
%w(one two three)
%i(one two three)

# good
%w[one two three]
%i[one two three]

詳しくはこちらをご覧ください


11

http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Stringsにあるパーセント文字列のドキュメントからの抜粋:

文字列を作成する%(...)の他に、%は他のタイプのオブジェクトを作成する場合があります。文字列と同様に、大文字は補間とエスケープ文字を許可し、小文字は無効にします。

これらはルビーのパーセント文字列のタイプです:
...
%w:文字列の配列


2
やあ、ありがとう!それは存在しないと私は考え始めていました。他の人から提供されたrubydocリンクは壊れています。
ジェリー

ドキュメントはこれらのためのものではなく、しばらくの間RubyDocsに含まれていませんでした。
ティンマン

2

ユーザーのフルネームのCSVスプレッドシートから一連の列を受け取り、スペースを含めてフォーマットを維持する必要がありました。rubyを使用しているときに私が見つけた最も簡単な方法は、次のとおりです。

names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('\n')

これ%()により、のような文字列が作成さ"Porter Smith\nJimmyJones\nRonald Jackson"れ、配列を取得するsplitには、"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

したがって、OPの元の質問にも答えるには、最終的な配列出力にを存在させたい%(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')場合があるのであれば、彼らが書いた可能性があります。spacespace

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