Я смотрю на документацию для FileUtils.
Я смущен следующей строкой:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
Что %w
значит? Можете ли вы указать мне на документацию?
Я смотрю на документацию для FileUtils.
Я смущен следующей строкой:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
Что %w
значит? Можете ли вы указать мне на документацию?
Ответы:
%w(foo bar)
это ярлык для ["foo", "bar"]
. Это означает, что записывать массив строк, разделенных пробелами, вместо запятых и без кавычек - это нотация. Вы можете найти список способов написания литералов в быстрой ссылке на zenspider .
%w(ab\ c def) # => ["ab c", "def"]
Я думаю о %w()
«словесном массиве» - элементы разделяются пробелами, и он возвращает массив строк.
Есть другие% литералы:
%r()
это еще один способ написать регулярное выражение.%q()
это еще один способ написать строку в одинарных кавычках (и может быть многострочным, что полезно)%Q()
дает строку в двойных кавычках%x()
это команда оболочки%i()
дает массив символов (Ruby> = 2.0.0)%s()
превращается foo
в символ ( :foo
)Я не знаю других, но там могут быть некоторые скрывающиеся ...
%i()
для генерации массива символов.
%()
(или %[]
или %{}
), который дает строку в двойных кавычках и экранирует двойные кавычки, например %Q()
. Например%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
Также есть %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 против% 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]
Подробнее читайте здесь .
Выдержано из документации для строк процентов на http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :
Помимо% (...), который создает строку,% может создавать другие типы объектов. Как и в случае со строками, заглавная буква допускает интерполяцию и экранированные символы, а строчная буква отключает их.
Это типы процентных строк в ruby:
...
% w : Array of Strings
Мне дали несколько столбцов из таблицы 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
чтобы они существовали в окончательном выводе массива.