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ę?

Dane O'Connor
źródło

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 .

sepp2k
źródło
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ć ...

Mike Woodhouse
źródło
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" <[email protected]>) # => "\"sender name\" <[email protected]>"
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...
Eraden
źródło
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!

Mark C.
źródło
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 .

Rajkaran Mishra
źródło
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

itsnikolay
źródło
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.

pjammer
źródło