Подтвердить что ты не робот

Что такое% w "вещь" в рубине?

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

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

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

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

Ответ 1

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

Используете ли вы {} []() или < > неважно, только если ваша строка содержит этот символ, например:

%q{a closing parenthesis: ")"}

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

Ответ 2

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

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 > %[email protected] s d [email protected]
 => ["a", "s", "d", "f"] 

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

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\"" 

Regex: (% 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] 

Ответ 3

Существуют различные формы сильного синтаксического литерала, которые можно использовать с почти любым парным разделителем, см. 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/

Ответ 4

  • Каково собственно имя этого% w "вещь"? Оператор? Буквальное? Конструктор?

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

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

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

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

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

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

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