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

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

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

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

Ответ 1

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

Ответ 2

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

Существуют и другие% литералов:

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

Я не знаю других, но там могут быть какие-то скрытые там...

Ответ 3

Существует также %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...

Ответ 4

%W и %W позволяют создавать массив строк без использования кавычек и запятых.

Ответ 5

Хотя это старая должность, вопрос продолжает подниматься, и ответы мне не всегда кажутся ясными, поэтому, мои мысли:

%w и %w являются примерами типов с общим ограничением ввода, которые относятся к массивам. Существуют и другие типы, которые включают %q, %q, %r, %x и %i.

Разница между версией верхнего и нижнего регистра заключается в том, что она дает нам доступ к функциям одиночных и двойных кавычек. С одинарными кавычками и (строчными буквами) %w у нас нет интерполяции кода (#{someCode}) и ограниченного диапазона управляющих символов, которые работают (\\, \n). С двойными кавычками и (в верхнем регистре) %w у нас есть доступ к этим функциям.

Используемый разделитель может быть любым символом, а не только открытой круглой скобкой. Играйте с приведенными выше примерами, чтобы увидеть, что это действительно.

Для полной записи с примерами %w и полного списка, escape-символы и разделители, посмотрите " Ruby -% w vs% W - секреты раскрыты!"

Ответ 6

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

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

Это типы процентных строк в рубине:
...
% w: массив строк

Ответ 7

Вместо %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]

Подробнее читайте здесь.

Ответ 8

Мне дали кучу столбцов из таблицы 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 существовал в окончательном выходе массива.