Co oznacza% w (tablica)?


835

Patrzę na dokumentację FileUtils.

Jestem zdezorientowany następującą linią:

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

Co %wznaczy Czy możesz wskazać mi dokumentację?

Odpowiedzi:


1244

%w(foo bar)jest skrótem do ["foo", "bar"]. Oznacza to, że zapisanie tablicy ciągów znaków oddzielonych spacjami zamiast przecinków i bez cudzysłowów to zapis. Listę sposobów pisania literałów znajdziesz w Quickref zenspider .


199
Ponadto nawias może być prawie dowolnym innym znakiem, takim jak nawiasy kwadratowe% w [...], nawiasy klamrowe% w {...} lub nawet coś w rodzaju wykrzyknika% w! ...! Wszystkie mają takie samo zachowanie (zwracanie tablicy).
ryanb

143
Najprostszym sposobem na mnemoniczne zapamiętanie, co to oznacza, jest „tablica oddzielona spacjami (w)”.
Julik,

7
Zobacz „Ogólne rozdzielane dane
Jared Beck

121
Jeśli ciąg znaków ma spacje, po prostu użyj znaku \. Np .:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy,

6
Zgadnij, że ta strona rozwiązałaby również pytanie: ruby-doc.org/core-2.0/doc/syntax/…
TheConstructor

471

Myślę o tym %w()jak o „tablicy słów” - elementy są rozdzielane spacjami i zwraca tablicę ciągów.

Istnieją inne% literałów:

  • %r() jest innym sposobem napisania wyrażenia regularnego.
  • %q() jest innym sposobem na napisanie ciągu pojedynczego cudzysłowu (i może być wielowierszowy, co jest przydatne)
  • %Q() daje ciąg cudzysłowu
  • %x() to polecenie powłoki
  • %i() daje tablicę symboli (Ruby> = 2.0.0)
  • %s()zamienia foosię w symbol ( :foo)

Nie znam innych, ale może się tam czaić ...


32
Począwszy od Ruby 2.0.0 możesz także używać %i()do generowania tablicy symboli.
David Tuite,

10
Istnieje również %()(lub %[]lub %{}), który daje ciąg podwójnego cudzysłowu i unika podwójnego cudzysłowu, na przykład %Q(). Np.%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
Dennis

59

Istnieje również %smożliwość tworzenia dowolnych symboli, na przykład:

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

Od Ruby 2.0.0 masz również:

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


22

Choć jest to stary post, pytanie wciąż się pojawia, a odpowiedzi nie zawsze wydają mi się jasne, oto moje przemyślenia:

%wi %Wsą przykładami ogólnych typów danych ograniczonych , które odnoszą się do tablic. Istnieją inne rodzaje, które obejmują %q, %Q, %r, %xi %i.

Różnica między wersją wielkimi i małymi literami polega na tym, że daje nam dostęp do funkcji pojedynczych i podwójnych cudzysłowów. W przypadku pojedynczych cudzysłowów i (małych liter) %wnie mamy interpolacji kodu ( #{someCode}) i ograniczonego zakresu znaków specjalnych, które działają ( \\, \n). Z cudzysłowach i (wielkimi literami) %Wmożemy nie mieć dostęp do tych funkcji.

Używanym ogranicznikiem może być dowolny znak, a nie tylko otwarty nawias. Zagraj w powyższe przykłady, aby zobaczyć, jak to działa.

Aby uzyskać pełny napis z przykładami %wi pełną listą, znaków ucieczki i ograniczników, zobacz „ Ruby -% w vs% W - ujawnione sekrety!


17

Zamiast tego %w()powinniśmy użyć%w[]

Według przewodnika po stylu Ruby:

Preferuj% w względem dosłownej składni tablicy, gdy potrzebujesz tablicy słów (niepuste ciągi znaków bez spacji i znaków specjalnych). Zastosuj tę regułę tylko do tablic z dwoma lub więcej elementami.

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

# good
STATES = %w[draft open closed]

Użyj nawiasów, które są najbardziej odpowiednie dla różnych rodzajów literałów procentowych.

[]dla literałów tablicowych ( %w, %i, %W, %I), ponieważ jest on wyrównany ze standardowymi literałami tablicowymi.

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

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

Więcej informacji tutaj .


11

Fragment dokumentacji ciągów procentowych pod adresem http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Oprócz% (...), który tworzy ciąg,% może tworzyć inne typy obiektów. Podobnie jak w przypadku łańcuchów, wielka litera umożliwia interpolację i znaki ucieczki, podczas gdy mała litera je wyłącza.

Oto typy ciągów procentowych w ruby:
...
% w : Array of Strings


2
Rany dzięki! Zaczynałem myśleć, że to nie istnieje. Linki rubydoc dostarczone przez innych są zepsute.
Gerry

Dokumentacja nie była dla nich przez dłuższy czas zawarta w RubyDocs.
Tin Man

2

Dostałem kilka kolumn z arkusza kalkulacyjnego CSV z pełnymi nazwami użytkowników i musiałem zachować formatowanie ze spacjami. Najłatwiejszym sposobem, w jaki udało mi się je zdobyć, używając rubinu, było:

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

Podkreśla, że %()tworzy ciąg podobny "Porter Smith\nJimmyJones\nRonald Jackson"do i, aby uzyskać tablicę, splitna której znajduje się ciąg"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Aby odpowiedzieć również na pierwotne pytanie OP, mogliby napisać, %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')gdyby zdarzyło się space, że chcesz, spaceaby istniała w ostatecznym wyniku tablicy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.