В чем разница между% w {} и% W {} верхними и нижними аргументами массива W массивов в Ruby?
%w[ ] Non-interpolated Array of words, separated by whitespace
%W[ ] Interpolated Array of words, separated by whitespace
Использование:
p %w{one one two three 0 1 1 2 3} # = > ["one", "one", "two", "three", "0", "1", "1", "2", "3"]
p %W{one one two three 0 1 1 2 3} # = > ["one", "one", "two", "three", "0", "1", "1", "2", "3"]
p %w{C:\ C:\Windows} # => ["C: C:\\Windows"]
p %W{C:\ C:\Windows} # => ["C: C:Windows"]
Мой вопрос... какая разница?
Ответы
Ответ 1
%W
рассматривает строки как двойные кавычки, тогда как %W
рассматривает их как одинарные кавычки (и, следовательно, не допускает интерполяции выражений или многочисленных escape-последовательностей). Повторите свои массивы с помощью рубиновых выражений, и вы увидите разницу.
Пример:
myvar = 'one'
p %w{#{myvar} two three 1 2 3} # => ["\#{myvar}", "two", "three", "1", "2", "3"]
p %W{#{myvar} two three 1 2 3} # => ["one", "two", "three", "1", "2", "3"]
Ответ 2
Давайте пропустим путаницу массива и поговорим об интерполяции против none:
irb(main):001:0> [ 'foo\nbar', "foo\nbar" ]
=> ["foo\\nbar", "foo\nbar"]
irb(main):002:0> [ 'foo\wbar', "foo\wbar" ]
=> ["foo\\wbar", "foowbar"]
Разница в поведении согласуется с тем, как ведут себя строки с одиночными кавычками и двойными кавычками.
Ответ 3
Вот пример ответа acconrads:
ruby-1.8.7-p334 :033 > @foo = 'bar'
=> "bar"
ruby-1.8.7-p334 :034 > %w(#{@foo})
=> ["\#{@foo}"]
ruby-1.8.7-p334 :035 > %W(#{@foo})
=> ["bar"]
Ответ 4
Чтобы продемонстрировать случай с интерполяцией и escape-последовательностью для обоих литералов, мы предполагаем, что:
>> a = 'a'
=> "a"
Буквенный %w
% в нижнем регистре:
>> %w[a#{a} b#{'b'} c\ d \s \']
=> ["a\#{a}", "b\#{'b'}", "c d", "\\s", "\\'"]
- обрабатывает все поставляемые слова в скобках как строки в одинарных кавычках
- не интерполирует строки
- не избегает последовательностей
- экранирует только пробелы
\
Буква %W
верхнем регистре:
>> %W[a#{a} b#{'b'} c\ d \s \']
=> ["aa", "bb", "c d", " ", "'"]
- обрабатывает все поставляемые слова в скобках как строки в двойных кавычках
- позволяет строковую интерполяцию
- избегает последовательности
- избегает также пробелы \
Источник: В чем разница между литералами массива% w и% W в Ruby