Що означає% w (масив)?


835

Я переглядаю документацію для FileUtils.

Мене бентежить наступний рядок:

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

Що %wозначає? Чи можете ви вказати мені документацію?

Відповіді:


1244

%w(foo bar)- це ярлик для ["foo", "bar"]. Значить, це позначення писати масив рядків, розділених пробілами, а не коми та без лапок навколо них. Список способів написання літералів ви можете знайти в Quickref zenspider .


199
Також в дужках може бути майже будь-який інший символ, наприклад квадратні дужки% w [...], фігурні дужки% w {...} або навіть щось подібне до знаків% w! ...!. Усі вони мають однакову поведінку (повертаючи масив).
ryanb

143
Найпростіший мнемонічний спосіб запам'ятати, що це означає - "Розділений масив Whitespace (w)".
Julik

7
Див. "Загальний розділений
Джаред Бек

121
Якщо рядок має пробіли, просто уникніть їх за допомогою \. Напр .:%w(ab\ c def) # => ["ab c", "def"]
Дмитро

6
Здогадайтесь, ця сторінка теж вирішила б питання: ruby-doc.org/core-2.0/doc/syntax/…
TheConstructor

471

Я думаю про %w()"масив слів" - елементи розділені пробілами, і він повертає масив рядків.

Є й інші% літерали:

  • %r() це ще один спосіб написати регулярний вираз.
  • %q() це ще один спосіб написання одноцитуваного рядка (і може бути багаторядковим, що корисно)
  • %Q() дає рядок з подвійним цитуванням
  • %x() - команда оболонки
  • %i() дає масив символів (Ruby> = 2.0.0)
  • %s()перетворюється fooна символ ( :foo)

Я не знаю інших, але там можуть ховатися якісь ...


32
Станом на Ruby 2.0.0 ви також можете використовувати %i()для створення масиву символів.
Девід Туйте

10
Є також %()(або %[]або %{}), який дає подвійний рядок і уникає подвійних лапок, наприклад %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 vs% W - секрети розкриті! "


17

Замість цього %w()ми повинні використовувати%w[]

Відповідно до керівництва зі стилю Ruby:

Віддайте перевагу% w синтаксису буквального масиву, коли вам потрібен масив слів (не порожні рядки без пробілів та спеціальні символи в них). Застосовуйте це правило лише до масивів з двома або більше елементами.

# 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

Витягнуто з документації для Percent Strings на веб-сторінці http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Крім% (...), який створює String,% може створювати інші типи об'єктів. Як і у рядках, велика літера дозволяє здійснювати інтерполяцію та уникнуті символи, тоді як маленька літера їх вимикає.

Це типи відсоткових рядків у рубіні:
...
% w : масив рядків


2
Дякую, дякую! Я починав думати, що його не існує. Рубідокові зв’язки, надані іншими, розриваються.
Джеррі

Документація не для цього не була включена в RubyDocs досить довго.
Бляшаний чоловік

2

Мені було надано купу стовпців із таблиці CSV з повними іменами користувачів, і мені потрібно було зберегти форматування з пробілами. Найпростіший спосіб я знайшов їх за допомогою рубіну:

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

На цьому наголошує , що %()створює рядок , як "Porter Smith\nJimmyJones\nRonald Jackson"і отримати масив , splitрядок в"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Отже, щоб відповісти на початкове запитання ОП, вони також могли написати, %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')якби це сталося, spaceколи ви хочете, spaceщоб існувало в кінцевому висновку масиву.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.