Я переглядаю документацію для 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"]
. Значить, це позначення писати масив рядків, розділених пробілами, а не коми та без лапок навколо них. Список способів написання літералів ви можете знайти в Quickref 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
та повного списку, рятувальних символів та роздільників, подивіться на " Ruby -% w vs% 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]
Детальніше читайте тут .
Витягнуто з документації для Percent Strings на веб-сторінці http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :
Крім% (...), який створює String,% може створювати інші типи об'єктів. Як і у рядках, велика літера дозволяє здійснювати інтерполяцію та уникнуті символи, тоді як маленька літера їх вимикає.
Це типи відсоткових рядків у рубіні:
...
% w : масив рядків
Мені було надано купу стовпців із таблиці 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
щоб існувало в кінцевому висновку масиву.