Что означают разные скобки в Ruby?

В Ruby, какая разница между {} и []?

{}, похоже, используется как для кодовых блоков, так и для хэшей.

Являются ли [] только для массивов?

Документация не очень понятна.

Ответ 1

Это зависит от контекста:

  • Когда они сами или назначают переменной, [] создает массивы, а {} создает хеши. например.

    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
    

Ответ 2

Другое, не столь очевидное, использование [] является синонимом вызова ProС# и вызова метода #. Это может быть немного запутанным в первый раз, когда вы столкнулись с этим. Я полагаю, что разумный подход заключается в том, что он больше похож на обычный вызов функции.

например.

proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)

proc["World"]
meth["Hello",","," ", "World!", "\n"]

Ответ 3

В общем, вы правы. Как и хеши, общий стиль заключается в том, что фигурные скобки {} часто используются для блоков, которые могут поместить все на одну строку, вместо использования do/end для нескольких строк.

Квадратные скобки [] используются как методы класса в множестве классов Ruby, включая String, BigNum, Dir и достаточно смутно, Hash. Итак:

Hash["key" => "value"]

справедлив как:

{ "key" => "value" }

Ответ 4

Квадратные скобки [] используются для инициализации массивов. Документация для случая инициализации [] находится в

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"

Ответ 5

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

[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

Ответ 6

Обратите внимание, что вы можете определить метод [] для своих собственных классов:

class A
 def [](position)
   # do something
 end

 def @rank.[]= key, val
    # define the instance[a] = b method
 end

end