Сведения о вопросе

NOTtoday

18:28, 22nd August, 2020

Теги

ruby   syntax    

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

Просмотров: 558   Ответов: 6

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

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

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

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



  Сведения об ответе

PHPH

19:52, 23rd August, 2020

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

  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
    


  Сведения об ответе

FAriza

03:35, 4th August, 2020

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

E.g.

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

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


  Сведения об ответе

LAST

02:40, 13th August, 2020

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

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

Hash["key" => "value"]

это так же справедливо, как:

{ "key" => "value" }


  Сведения об ответе

FAriza

21:06, 1st October, 2020

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

ri Array::[]

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

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"


  Сведения об ответе

прога

21:06, 1st October, 2020

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

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

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

end


  Сведения об ответе

#hash

09:00, 11th August, 2020

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

[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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться