Что означают разные скобки в Ruby? - PullRequest
83 голосов
/ 15 августа 2008

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

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

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

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

Ответы [ 6 ]

69 голосов
/ 18 августа 2008

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

  1. При самостоятельном присвоении или присвоении переменной [] создает массивы, а {} создает хэши. например,

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] может быть переопределен как пользовательский метод и обычно используется для извлечения вещей из хешей (стандартная библиотека устанавливает [] как метод для хешей, который совпадает с fetch)
    Существует также соглашение, что он используется как метод класса так же, как вы можете использовать метод static Create в C # или 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 для последнего примера.

  3. Это, наверное, самый хитрый - {} также является синтаксисом для блоков, но только при передаче методу вне аргументов.

    Когда вы вызываете методы без паренов, Ruby смотрит на то, где вы ставите запятые, чтобы выяснить, где заканчиваются аргументы (где бы были паренсы, если бы вы их набрали)

    1.upto(2) { puts 'hello' } # it's 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
    
20 голосов
/ 02 апреля 2009

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

Е.Г.

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
9 голосов
/ 15 августа 2008

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

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

Hash["key" => "value"]

так же действует, как:

{ "key" => "value" }
3 голосов
/ 17 сентября 2008

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

ri Array::[]

фигурные скобки {} используются для инициализации хэшей. Документация для случая инициализатора {} находится в

ri Hash::[]

Квадратные скобки также обычно используются в качестве метода во многих основных классах ruby, таких как 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"
2 голосов
/ 14 октября 2009

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

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

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

end
2 голосов
/ 15 августа 2008

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

[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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...