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ę?
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:
%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 foosię 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ż %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...
%Wi%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:
%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! ”
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ę, 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.