В чем разница между %w{} и %W{} литералами массива в процентах от верхнего и нижнего регистра в Ruby?

#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