Ce înseamnă diferitele paranteze din Ruby?

În Ruby, care este diferența dintre {} și [] ?

{} seems to be used for both code blocks and hashes.

Sunt [] numai pentru matrice?

Documentația nu este foarte clară.

0
fr hi bn

6 răspunsuri

Depinde de context:

  1. When on their own, or assigning to a variable, [] creates arrays, and {} creates hashes. e.g.

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] can be overridden as a custom method, and is generally used to fetch things from hashes (the standard library sets up [] as a method on hashes which is the same as fetch)
    There is also a convention that it is used as a class method in the same way you might use a static Create method in C# or Java. e.g.

    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
    

    See the ruby Hash docs for that last example.

  3. This is probably the most tricky one - {} is also syntax for blocks, but only when passed to a method OUTSIDE the arguments parens.

    When you invoke methods without parens, ruby looks at where you put the commas to figure out where the arguments end (where the parens would have been, had you typed them)

    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
    
0
adăugat
Notă: Hash # fetch nu este exact Hash # []. {: a => 1,: b => 2} .fetch (: c) IndexError: cheia nu a fost găsită
adăugat autor tokland, sursa
@tokland : c nu a fost găsit
adăugat autor YoYoYonnY, sursa
"Există, de asemenea, o convenție care este folosită ca metodă de clasă în același mod în care puteți folosi o metodă statică de creare în C# sau Java." Acesta este exact răspunsul pe care îl căutam. De asemenea, un exemplu clasic de ceea ce urăsc cel mai mult despre Ruby; trebuie sa stii cateva trucuri putin obscure pentru a citi codul Ruby.
adăugat autor Tony, sursa

câteva exemple:

[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
0
adăugat
lambda {1 + 2} [] # => 3
adăugat autor ms-ati, sursa

În general vorbind, ai dreptate. La fel ca și hash-urile, stilul general este că adânciturile {} sunt deseori folosite pentru blocuri care se potrivesc pe o singură linie, în loc să folosească do pe mai multe rânduri.

Parantezele paranteze [] sunt folosite ca metode de clasă în multe clase Ruby, inclusiv String, BigNum, Dir și destul de confuz, Hash. Asa de:

Hash["key" => "value"]

este la fel de valabil ca:

{ "key" => "value" }
0
adăugat

Rețineți că puteți defini metoda [] pentru propriile clase:

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

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

end
0
adăugat
Ce este @rank. ?
adăugat autor FeifanZ, sursa

Parantezele pătrate [] sunt utilizate pentru a inițializa matricele. Documentația pentru cazul inițializatorului din [] este în

ri Array::[]

Parantezele curbate {} sunt folosite pentru a inițializa hash-urile. Documentația pentru cazul inițializatorului de {} se află în

ri Hash::[]

Parantezele pătrate sunt, de asemenea, utilizate frecvent ca metodă în multe clase de bază de rubinie, cum ar fi Array, Hash, String și altele.

Puteți accesa o listă cu toate clasele care au definit metoda "[]"

ri []

cele mai multe metode au, de asemenea, o "[] =" metodă care permite să atribuiți lucruri, de exemplu:

s = "hello world"
s[2]     # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s        # => "hemlo world"

Parantezele curbate pot fi de asemenea folosite în loc de "do ... end" în blocuri, ca "{...}".

Un alt caz în care puteți vedea paranteze pătrate sau paranteze curbate utilizate - se află în inițialele speciale în care poate fi folosit orice simbol, cum ar fi:

%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"
0
adăugat

O altă utilizare, nu atât de evidentă, a [] este ca un sinonim pentru apelul Proc # și metoda #. Acest lucru ar putea fi cam confuz de prima dată când o întâlniți. Cred că rațiunea din spatele ei este că o face să arate mai mult ca un apel normal de funcție.

De exemplu.

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
0
adăugat
Niciodată nu a știut asta, mulțumesc!
adăugat autor Tilendor, sursa