В Ruby, какая разница между {}
и []
?
{}
, похоже, используется как для кодовых блоков, так и для хэшей.
Являются ли []
только для массивов?
Документация не очень понятна.
В Ruby, какая разница между {}
и []
?
{}
, похоже, используется как для кодовых блоков, так и для хэшей.
Являются ли []
только для массивов?
Документация не очень понятна.
Это зависит от контекста:
Когда они сами или назначают переменной, []
создает массивы, а {}
создает хеши. например.
a = [1,2,3] # an array
b = {1 => 2} # a hash
[]
может быть переопределен как пользовательский метод и обычно используется для извлечения данных из хэшей (стандартная библиотека устанавливает []
как метод хэшей, который совпадает с fetch
) < ш > Существует также соглашение о том, что он используется как метод класса так же, как вы можете использовать метод static Create
в С# или Java. например.
a = {1 => 2} # create a hash for example
puts a[1] # same as a.fetch(1), will print 2
Hash[1,2,3,4] # this is a custom class method which creates a new hash
Обратитесь к Ruby Hash docs для этого последнего примера.
Это, наверное, самый хитрый -
{}
также является синтаксисом для блоков, но только при передаче в метод OUTSIDE аргументы parens.
Когда вы вызываете методы без парнеров, Ruby смотрит на то, где вы помещаете запятые, чтобы выяснить, где заканчиваются аргументы (где были бы parens, если бы вы их набрали)
1.upto(2) { puts 'hello' } # it a block
1.upto 2 { puts 'hello' } # syntax error, ruby can't figure out where the function args end
1.upto 2, { puts 'hello' } # the comma means "argument", so ruby sees it as a hash - this won't work because puts 'hello' isn't a valid hash
Другое, не столь очевидное, использование []
является синонимом вызова ProС# и вызова метода #. Это может быть немного запутанным в первый раз, когда вы столкнулись с этим. Я полагаю, что разумный подход заключается в том, что он больше похож на обычный вызов функции.
например.
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::[]
Квадратные скобки также обычно используются как метод во многих основных классах рубинов, таких как Array, Hash, String и др.
Вы можете получить доступ к списку всех классов, у которых есть метод "[]", определенный с помощью
ri []
у большинства методов также есть метод "[] =", который позволяет присваивать вещи, например:
s = "hello world"
s[2] # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s # => "hemlo world"
Кувырчатые скобки также могут использоваться вместо "do... end" на блоках, как "{...}".
Другой случай, когда вы можете видеть квадратные скобки или фигурные скобки, используемые - находится в специальных инициализаторах, где может использоваться любой символ, например:
%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