Что означает% w (массив)?


837

Я смотрю на документацию для FileUtils.

Я смущен следующей строкой:

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

Что %wзначит? Можете ли вы указать мне на документацию?

Ответы:


1246

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


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

143
Самый простой способ мнемонически запомнить, что это означает, - «разделенный массив пробелов (w)».
Julik

7
См. «Общий ввод с разделителями» здесь ruby-doc.org/docs/ProgrammingRuby/html/language.html
Джаред Бек,

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и полным списком, escape-символов и разделителей, взгляните на " Ruby -% w против% 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

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

Помимо% (...), который создает строку,% может создавать другие типы объектов. Как и в случае со строками, заглавная буква допускает интерполяцию и экранированные символы, а строчная буква отключает их.

Это типы процентных строк в ruby:
...
% w : Array of Strings


2
Боже, спасибо! Я начинал думать, что его не существует. Ссылки на рубидок, предоставленные другими, не работают.
Джерри

Документация не для них не была включена в RubyDocs в течение достаточно долгого времени.
Жестянщик

2

Мне дали несколько столбцов из таблицы CSV с полными именами пользователей, и мне нужно было сохранить форматирование с пробелами. Самый простой способ получить их при использовании ruby ​​- это сделать:

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

Это выдвигает на первый план то, что %()создает строку как "Porter Smith\nJimmyJones\nRonald Jackson"и, чтобы получить массив Вы splitстрока на"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Таким образом, чтобы ответить на оригинальный вопрос OP, они могли бы написать, %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')если бы это случилось, spaceкогда вы хотите, spaceчтобы они существовали в окончательном выводе массива.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.