2009-03-27 6 views
129

В чем разница?Рубиновые массивы:% w против% W

+13

«% w» - это моя обычная реплика для людей, которые слишком сильно сомневаются в удобочитаемости Ruby. Работает каждый раз. –

+0

теперь у вас есть еще лучший ответ :-) – errata

+4

Как нерелевантная сторона примечания, URL-адрес этого вопроса несколько смутил меня, пока страница загружалась. –

ответ

205

% w цитирует одиночные кавычки '' (без переменной интерполяции, меньше escape-последовательностей), а% W цитирует двойные кавычки "".

irb(main):001:0> foo="hello" 
=> "hello" 
irb(main):002:0> %W(foo bar baz #{foo}) 
=> ["foo", "bar", "baz", "hello"] 
irb(main):003:0> %w(foo bar baz #{foo}) 
=> ["foo", "bar", "baz", "\#{foo}"] 
+0

Ваш пример показывает двойные кавычки для% w тоже. Правильно ли это? – Foton

+0

Да. При печати вывода Ruby всегда использует двойные кавычки и выдает символы типа '#'. '' # {foo} ''и' "\ # {foo}" 'дает вам ту же строку, которую вы можете проверить с помощью' '# {foo}' ==" \ # {foo} "' in 'irb' , –

+0

Это немного запутанно на первый взгляд, но спасибо за объяснение. – Foton

19

% W выполняет обычные замены двойной кавычки. % w нет.

26

Приложение я нашел для% W против% вес:

greetings = %W(hi hello #{"how do you do"}) 
# => ["hi", "hello", "how do you do"] 
+0

Аккуратный взлом, спасибо! – akuhn

+9

Хотя в этом случае проще просто выполнить 'greetings =% w (привет привет, как \ do \ you \ do)' – dinjas

10

Хотя старый пост, вопрос продолжают поступать и ответы не всегда кажутся ясными для меня. Итак, вот мои мысли.

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

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

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

Целых пишут с примерами% вес и полный список, избежать символов и разделителей - посмотреть на: http://cyreath.blogspot.com/2014/05/ruby-w-vs-w-secrets-revealed.html

Марк

1

%W используется для элементов с двойными кавычками, таких как %Q, например

foo = "!" 
%W{hello world #{foo}} # => ["hello", "world", "!"] 

%w используется для элементов с одной кавычкой, таких как %q.

%w(hello world #{foo}) 
# => ["hello","world", "\#{foo}"]