Каковы все различные виды использования [квадратных скобок] в Ruby?

Я иду через квадратную скобку [] синтаксис совсем немного в Ruby, но он никогда не делает то же самое. Может ли кто-нибудь перечислить все различные виды использования квадратных скобок [] в Ruby, чтобы мой ум мог справиться с этим, казалось бы, бесконечно универсальным маленьким символом? (Как возможно, что один символ может сделать так много, чтобы интерпретатор Ruby не запутался?)

примеры:

  • [] и []= методы
  • %q[...]
  • [1,2,3][0]
  • hash["a"] = 3
  • ary = []
  • /[^A-Fa-f0-9]/
  • "Is a string"[5,3]

2 ответов


квадратные скобки находятся в строгих условиях и один необязательный:

Определение Массивов
Массивы, т. е. структура данных, предоставляющая и упорядоченный список элементов, могут быть указаны в коде с помощью синтаксиса [1,2,3]. Это создает массив с тремя элементами 1, 2 и 3 именно в этом порядке. затем вы можете перебирать массив, используя функции итератора, такие как each или map или вы можете напрямую получить доступ к конкретные элементы по индексу ID, как показано ниже.

доступ к элементам в массивах и хэшах
Хэши (также называемые хэш-картами, словарями или ассоциативными массивами на других языках) также содержат элементы, похожие на массивы. Они отличаются от этого тем, как они хранят свои данные ненумерованный. Доступ к данным осуществляется не целочисленным идентификатором, как в случае массивов, а произвольным ключом (обычно символом или строкой). Это другое например, PHP, где один и тот же тип массива используется для обоих.

этот доступ к данным облегчается методами, называемыми [] и []= для хэшей и массивов.

my_array = [:a, :b, :c]
second_element = my_array[1]
# => :b
# notice that the first element in arrays always has the index 0

my_hash = {:a => 1, :b => 2, :c => 3}
element_of_b = my_hash[:b]
# => 2

это общий случай использования скобок. В коде Ruby иногда можно увидеть другие классы, реализующие функции скобок. Они делают это, чтобы разрешить доступ, подобный массивам или хэшам, и тогда обычно ожидается, что эти классы ведут себя подобно тем, но это никоим образом не исполняются. См. также Утиной Типизацией.

% нотация
Ruby имеет третий синтаксис для создания строк (и других объектов), кроме общего. Используя этот синтаксис, литеральная строка в коде не заключена в " или ' но используйте специальный разделитель. Он начинается со знака процента, одного символа, указывающего создаваемый объект, и почти любого символа, выбранного в качестве разделителя:

a = %w[foo bar baz]
b = %w{foo bar baz}
c = %wxfoo bar bazx
d = ["foo", "bar", "baz"]

все три пример создайте тот же массив. Пожалуйста, посмотрите некоторые документация о том, как использовать этот синтаксис и какие другие модифицирующие символы доступны в Ruby.

хотя здесь часто используются скобки, они не требуются и могут быть заменены, если это необходимо. Это просто совет, так как наиболее распространенным использованием этой нотации является создание массива элементов из строки, разделенной пробелами (как показано выше). Таким образом, использование скобок делает его более ясным что массив возвращается как синтаксис, похожий на базовую спецификацию массива.


хорошо, только для моих собственных заметок я пошел и поближе посмотрел на это и, опираясь на Хольгер просто ответ, придумайте следующее: использование квадратных скобок в Ruby можно разделить на 6 применений, 3 из которых являются частью определений метода Ruby и 3 из них семантические конструкции.

определение метода

создание объектов с помощью методов класса Array:: [], Hash:: []

Array.[](1,2,3) #=> [1,2,3]                        #Un-sugared notation
Array["a","b","c"] #=> ["a","b","c"]               #Sugared equivalent
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}  

ничего общего с буквальным конструкторов, хотя он делает то же самое.

ссылка на элемент через массив методов экземпляра# [], Bignum# [], продолжение# [], Fixnum# [], хэш# [], MatchData# [], метод# [], Proc# [], String# [], Struct# [], Symbol# [], Thread# [] и методы класса Dir:: [], ENV:: []

ary = [1,2,"abc", [15,16,[26,27]]]  
ary.[](2) #=> "abc"                #Un-sugared notation
ary[2] #=> "abc"                   #Sugared equivalent
ary[0,2] #=> [1,2]  
ary[3][2][1] #=> 26  
[1,2,3][0] #=> 1  
"Is a string"[7,3] #=> "rin"  

назначение элементов с помощью методов экземпляра Array# []=, Hash# []=, String# []=, Struct# []=, Thread# []= и class метод ENV:: []=

ary = [1,2,3]  
ary.[]=(1,"abc") #=> [1,"abc",3]    #un-sugared notation
ary[2] = "def" #=> [1,"abc","def"]  #Sugared equivalent
hash = {"a"=>1, "b"=>2}  
hash["a"] = 3 #=> {"a"=>3, "b"=>2}  

смысловых конструктов

создание объекта с помощью конструктора Array literal

ary = []  

в Ruby есть куча литеральных конструкторов, которые создают объект соответствующего класса с помощью (обычно) простой пары символов, квадратные скобки являются литеральным конструктором для объектов массива: Array [], хэш {}, Proc ->(){}, ряд .. и ..., Regexp //, String "" и '', символ : и :"".

создание объекта с помощью % notation

%q[hello there you] #=> "hello there you"           # String % notation  
%w[hello there you] #=> ["hello", "there", "you"]   # Array % notation  

это, строго говоря, не квадратная скобка, а скорее двухсимвольная пара, которую вы можете использовать квадратные скобки, если хотите. Так что %q@hello there you@ одинаково действительны.

Рубин

/[^A-Fa-f0-9]/  

квадратные скобки указывают классы символов в регулярных выражениях Ruby.

я нашел другое использование [], как шаблон для использования в методе Dir::glob, но он должен действовать точно так же, как и в регулярных выражениях. Тем не менее, это указывает на то, что, возможно, есть больше применений, скрытых в методах 1500+ Ruby.