Ответ 1
%w(foo bar)
является ярлыком для ["foo", "bar"]
. Это означает, что нужно писать массив строк, разделенных пробелами, а не запятыми и без кавычек вокруг них. Вы можете найти список способов написания литералов в zenspider quickref.
Я смотрю документацию для FileUtils. Меня смущает следующая строка:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
Что означает %w
? Можете ли вы указать мне на документацию?
%w(foo bar)
является ярлыком для ["foo", "bar"]
. Это означает, что нужно писать массив строк, разделенных пробелами, а не запятыми и без кавычек вокруг них. Вы можете найти список способов написания литералов в zenspider quickref.
Я думаю о %w()
как "массив слов" - элементы разделяются пробелами.
Существуют и другие% литералов:
%r()
- это еще один способ написать регулярное выражение.%q()
- это еще один способ написать строку с одной кавычкой (и может быть многострочной, что полезно)%q()
содержит строку с двумя кавычками%x()
- это команда оболочки%i()
дает массив символов (Ruby >= 2.0.0)%s()
превращает foo
в символ (:foo
)Я не знаю других, но там могут быть какие-то скрытые там...
Существует также %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...
%W
и %W
позволяют создавать массив строк без использования кавычек и запятых.
Хотя это старая должность, вопрос продолжает подниматься, и ответы мне не всегда кажутся ясными, поэтому, мои мысли:
%w
и %w
являются примерами типов с общим ограничением ввода, которые относятся к массивам. Существуют и другие типы, которые включают %q
, %q
, %r
, %x
и %i
.
Разница между версией верхнего и нижнего регистра заключается в том, что она дает нам доступ к функциям одиночных и двойных кавычек. С одинарными кавычками и (строчными буквами) %w
у нас нет интерполяции кода (#{someCode}
) и ограниченного диапазона управляющих символов, которые работают (\\
, \n
). С двойными кавычками и (в верхнем регистре) %w
у нас есть доступ к этим функциям.
Используемый разделитель может быть любым символом, а не только открытой круглой скобкой. Играйте с приведенными выше примерами, чтобы увидеть, что это действительно.
Для полной записи с примерами %w
и полного списка, escape-символы и разделители, посмотрите " Ruby -% w vs% W - секреты раскрыты!"
Выдержка из документации для Percent Strings на http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings:
Помимо% (...), который создает String,% может создавать другие типы объектов. Как и в случае с строками, буква в верхнем регистре позволяет интерполировать и экранировать символы, в то время как строчная буква отключает их.
Это типы процентных строк в рубине:
...
% w: массив строк
Вместо %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]
Подробнее читайте здесь.
Мне дали кучу столбцов из таблицы 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
существовал в окончательном выходе массива.