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

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

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

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

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

15.08.2008 18:09:52
6 ОТВЕТОВ
РЕШЕНИЕ

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

  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 для этого последнего примера.

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

    Когда вы вызываете методы без паренов, 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
70
4.12.2014 05:34:45
примечание: Hash # fetch не совсем Hash # []. {: a => 1,: b => 2} .fetch (: c) IndexError: ключ не найден
tokland 13.02.2011 12:43:27
@tokland :cне найден
yyny 27.12.2016 10:58:03
«Существует также соглашение, что он используется как метод класса так же, как вы можете использовать статический метод Create в C # или Java». Это именно тот ответ, который я искал. Также классический пример того, что я больше всего ненавижу в Ruby; Вы должны знать тонны неясных маленьких хитростей, чтобы читать код на Ruby.
Tony 28.08.2017 14:37:15

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

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

Hash["key" => "value"]

так же, как:

{ "key" => "value" }
9
4.12.2014 05:42:31

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

[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
2
15.08.2008 19:03:12

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

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"
3
17.09.2008 07:52:50

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

Например

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
21
4.12.2014 05:36:16

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

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

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

end
2
4.12.2014 05:35:45
Что это @rank.?
FeifanZ 5.03.2018 18:08:33