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

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

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

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

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

6 ответов

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

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

    Hash["key" => "value"]
    

    как раз как действителен как:

    { "key" => "value" }
    
  2. несколько примеров:

    [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
    
  3. Это зависит от контекста:

    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. Это, вероятно, самый сложный —
      {}также синтаксис для блоков, но только при передаче в метод вне аргументов 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
      
  4. Квадратные скобки [ ] используются для инициализации массивов.
    Документация для случая инициализатора [ ] находится в

    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 «on BL blockss, as» {… }».

    Еще один случай, когда вы можете видеть квадратные скобки или фигурные скобки, используемые — в специальных инициализаторах, где может использоваться любой символ, например:

    %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. Другое, не столь очевидное, использование []is как синоним Proc#call и Method#call. Это может быть немного запутанным в первый раз, когда вы сталкиваетесь с ним. Я думаю, что рационально за этим стоит то, что это делает его больше похожим на обычный вызов функции.

    Например.

    proc = Proc.new { |what| puts "Hello, #{what}!" }
    meth = method(:print)
    
    proc["World"]
    meth["Hello",","," ", "World!", "\n"]
    
  6. Обратите внимание, что можно определить []метод для собственных классов:

    class A
     def [](position)
       # do something
     end
    
     def @rank.[]= key, val
        # define the instance[a] = b method
     end
    
    end