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 %w
znaczy Czy możesz wskazać mi dokumentację?
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 %w
znaczy Czy możesz wskazać mi dokumentację?
Odpowiedzi:
%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 .
%w(ab\ c def) # => ["ab c", "def"]
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 foo
się w symbol ( :foo
)Nie znam innych, ale może się tam czaić ...
%i()
do generowania tablicy symboli.
%()
(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>"
Istnieje również %s
moż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...
%W
i%w
pozwalają tworzyć tablicę ciągów bez użycia cudzysłowów i przecinków.
Choć jest to stary post, pytanie wciąż się pojawia, a odpowiedzi nie zawsze wydają mi się jasne, oto moje przemyślenia:
%w
i %W
są przykładami ogólnych typów danych ograniczonych , które odnoszą się do tablic. Istnieją inne rodzaje, które obejmują %q
, %Q
, %r
, %x
i %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) %w
nie mamy interpolacji kodu ( #{someCode}
) i ograniczonego zakresu znaków specjalnych, które działają ( \\
, \n
). Z cudzysłowach i (wielkimi literami) %W
moż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 %w
i pełną listą, znaków ucieczki i ograniczników, zobacz „ Ruby -% w vs% W - ujawnione sekrety! ”
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 .
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
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ę, split
na 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, space
aby istniała w ostatecznym wyniku tablicy.