В Ruby какая разница между {}
и []
?
Похоже, что {}
используется как для блоков кода, так и для хэшей.
А []
используются только для массивов?
Документ не очень понятен.
Это зависит от контекста:
При самостоятельном использовании или присвоении переменной []
создает массивы, а {}
- хэши. например.
a = [1,2,3] # массив
b = {1 => 2} # хэш
[]
может быть переопределен как пользовательский метод и обычно используется для получения данных из хэшей (стандартная библиотека устанавливает []
как метод для хэшей, который является тем же самым, что и fetch
)
Существует также соглашение, что он используется как метод класса, так же, как вы можете использовать статический метод Create
в C# или Java. например.
a = {1 => 2} # создаем хэш для примера
puts a[1] # то же самое, что a.fetch(1), выведет 2
Hash[1,2,3,4] # это метод пользовательского класса, который создает новый хэш
Последний пример смотрите в документах Ruby Hash docs.
{}
также является синтаксисом для блоков, но только когда передается методу ВНЕ паренса аргументов.Когда вы вызываете методы без паренсов, Ruby смотрит на то, где вы поставили запятые, чтобы определить, где заканчиваются аргументы (где были бы паренсы, если бы вы их набрали)
1.upto(2) { puts 'hello' } # это блок
1.upto 2 { puts 'hello' } # синтаксическая ошибка, ruby не может понять, где заканчиваются аргументы функции
1.upto 2, { puts 'hello' } # запятая означает "аргумент", поэтому ruby воспринимает его как хэш - это не сработает, потому что puts 'hello' не является правильным хэшем
Еще один, не столь очевидный, использование []
- это как синоним прок#вызов и метод#вызов. Это может быть немного запутанным в первый раз, когда вы сталкиваетесь его. Я думаю, рациональное за то, что это делает его более похожим на обычный вызов функции.
Е. Г.
proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)
proc["World"]
meth["Hello",","," ", "World!", "\n"]
В целом, вы правы. Помимо хэшей, общий стиль таков, что фигурные скобки {}
часто используются для блоков, которые могут поместиться в одной строке, вместо того, чтобы использовать do
/end
в нескольких строках.
Квадратные скобки []
используются в качестве методов класса во многих классах Ruby, включая String, BigNum, Dir и, как ни странно, Hash. Итак:
Hash["key" => "value"]
так же корректно, как и:
{ "key" => "value" }
Квадратные скобки [ ] используются для инициализации массивов. Документацию по делу инициализатор [ ] в
ri Array::[]
Фигурные скобки { } используются для инициализации хеш. Документацию по делу инициализатора { } в
ri Hash::[]
Квадратные скобки часто используется в качестве метода во многих основных классов Ruby, как и массив, хэш строки, и другие.
Вы можете открыть список всех классов, которые имеют способ и"[ ]" с определенными с
ri []
большинство методов также есть и "[ ]=" и метод, который позволяет присвоить вещи, например:
s = "hello world"
s[2] # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s # => "hemlo world"
Фигурные скобки могут также использоваться вместо "и вообще ... конец" на блоках, как " { ... } себе".
Другой случай, когда вы можете увидеть квадратные скобки или использовать фигурные скобки - это специальный инициализаторы, где любой символ может быть использован, как:
%w{ hello world } # => ["hello","world"]
%w[ hello world ] # => ["hello","world"]
%r{ hello world } # => / hello world /
%r[ hello world ] # => / hello world /
%q{ hello world } # => "hello world"
%q[ hello world ] # => "hello world"
%q| hello world | # => "hello world"
несколько примеров:
[1, 2, 3].class
# => Array
[1, 2, 3][1]
# => 2
{ 1 => 2, 3 => 4 }.class
# => Hash
{ 1 => 2, 3 => 4 }[3]
# => 4
{ 1 + 2 }.class
# SyntaxError: compile error, odd number list for Hash
lambda { 1 + 2 }.class
# => Proc
lambda { 1 + 2 }.call
# => 3
Обратите внимание, что вы можете определить метод []
для ваших собственных классов:
class A
def [](position)
# do something
end
def @rank.[]= key, val
# define the instance[a] = b method
end
end