#ruby
#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-последовательности). Попробуйте еще раз использовать ваши массивы с выражениями ruby, и вы увидите разницу.
ПРИМЕР:
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"]
Комментарии:
1. Проверьте редактирование, мне нравится ваш пример, он многое объясняет. Вывод последних двух строк в моем примере сбивает меня с толку.
2. Опять же, вы не используете выражение ruby, оно не окружено символом «#{}». Обратная косая черта — это специальный символ в Ruby, который используется для буквальной интерпретации других специальных символов, и вы используете его в контексте строки, а не выражения. Это объясняет, почему обратные косые черты отбрасываются в двойных кавычках, а не в одинарных.
3. Я думаю, что точка зрения c00lryguy глубже. 1) Несмотря на то, что
' '
="\ "
, обратная косая черта исчезла с%w{}
. 2) Существует также общий вопрос о том, когда обратная косая черта игнорируется, как в"W"
="W"
, как показано в%W{}
.4. Косые черты никогда не игнорируются в строках, заключенных в двойные кавычки, они всегда интерпретируются как escape. иногда этот escape может быть ненужным, например, в » W», но косая черта всегда будет использоваться. В строках, заключенных в одинарные кавычки, они используются только тогда, когда символ действительно необходимо экранировать.
Ответ №2:
Давайте пропустим путаницу с массивами и поговорим об интерполяции в сравнении с none:
irb(main):001:0> [ 'foonbar', "foonbar" ]
=> ["foo\nbar", "foonbar"]
irb(main):002:0> [ 'foowbar', "foowbar" ]
=> ["foo\wbar", "foowbar"]
Разница в поведении согласуется с тем, как ведут себя строки, заключенные в одинарные и двойные кавычки.
Ответ №3:
Чтобы продемонстрировать случай с интерполяцией и экранированием последовательности для обоих литералов, мы предполагаем, что:
>> a = 'a'
=> "a"
Литерал в процентах в нижнем регистре %w
в Ruby?:
>> %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