Что такое% w "вещь" в рубине? - PullRequest
20 голосов
/ 29 марта 2011

Я имею в виду оператор / конструктор% w / как вы его называете, используется так:

%w{ foo bar baz }
=> ["foo", "bar", "baz"]

У меня есть несколько вопросов по этому поводу:

  • Какое собственное название этой %w "вещи"? Оператор? Буквальное? Конструктор
  • Имеет ли значение, использую ли я {} с вместо [] с?
  • Существуют ли другие подобные вещи (например, та, которая дает вам массив символов)?
  • Могут ли они быть вложенными (один %w внутри другого %w, для создания вложенных массивов)?
  • Где я могу найти документацию по этому поводу?

Ответы [ 4 ]

23 голосов
/ 29 марта 2011

1) Это буквально, где это %, затем a r (регулярное выражение), w (массив), q (строка) и т. Д. Для обозначения различных букв.

2)

ruby-1.9.2-p136 :001 > %w{1 2 3}
 => ["1", "2", "3"] 
ruby-1.9.2-p136 :002 > %w[1 2 3]
 => ["1", "2", "3"] 

ruby-1.9.2-p136 :008 > %w!a s d f!
 => ["a", "s", "d", "f"] 

ruby-1.9.2-p136 :009 > %w@a s d f@
 => ["a", "s", "d", "f"] 

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

3)

Вот еще несколько примеров:

Строки: (% q или% Q)

ruby-1.9.2-p136 :016 > %Q[ruby is cool]
 => "ruby is cool" 
ruby-1.9.2-p136 :017 > %q[ruby is "cool"]
 => "ruby is \"cool\"" 

Регулярное выражение: (% r)

ruby-1.9.2-p136 :019 > %r[(\w+)]
 => /(\w+)/ 

Команда Sys: (% x)

ruby-1.9.2-p136 :020 > %x[date]
 => "Tue Mar 29 12:55:30 EDT 2011\n"

4) Они не могут быть вложенными, потому что %w означает разделенный массив пробелов. Так что, если вы попытаетесь сделать многоуровневый, это будет выглядеть так:

ruby-1.9.2-p136 :003 > %w{1 %w{2 3 4} 5}
 => ["1", "%w{2", "3", "4}", "5"] 

Для этого вам нужно использовать более подробный синтаксис:

ruby-1.9.2-p136 :011 > [1, [2,3,4], 5]
 => [1, [2, 3, 4], 5] 
10 голосов
/ 29 марта 2011

Не уверен насчет "официальной" документации, но это довольно хорошо: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#The_.25_Notation

Независимо от того, используете ли вы {} [] () или <>, не имеет значения, за исключением случаев, когда ваша строка содержит этот символ, например ::10000 *

%q{a closing parenthesis: ")"}

Синтаксис довольно сложный, поэтому запоминание каждого варианта не очень полезно, но может пригодиться, когда вы быстро взламываете и хотите избежать ручной обработки escape-символов.

8 голосов
/ 29 марта 2011

Существуют различные формы буквального синтаксиса , которые вы можете использовать, практически с любым парным разделителем, см. http://www.ruby -doc.org / docs / ProgrammingRuby / html / language.html :

%w[one two three] # == ["one", "two", "three"]

%[one two three] # == "one two three"
%[one "two" three] # == "one \"two\" three"

%r[one two three] # == /one two three/
1 голос
/ 29 марта 2011
  • Какое собственное имя у этой% w "вещи"? Оператор? Буквальное? Конструктор

Не совсем уверен, я думаю, строковые литералы.

  • Имеет ли значение, использую ли я {} вместо [] s?

Нет. Вы можете использовать практически любой персонаж на самом деле. Если вы начинаете с {, [ или (, вам нужно закрыть его закрывающим аналогом, но другие символы закрываются тем же символом. Вы, вероятно, хотите использовать символ, который не будет появляться внутри вашего литерала.

%w_ foo bar _
  • Существуют ли другие подобные вещи (например, та, которая вместо этого дает вам массив символов)?

Не один для массива символов, но есть %q для строки в одинарных кавычках, %Q для строки в двойных кавычках, %r для регулярных выражений и, вероятно, несколько других, которые я забыл .

  • Могут ли они быть "вложенными" (один% w внутри другого% w, чтобы создать вложенные массивы)?

Неа. Они предназначены для быстрых и простых способов создания простых объектов. Если вам нужно вложение, вам нужно использовать более подробный синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...