Apa yang berbeda kurung di Ruby berarti?

Di Ruby, apa's perbedaan antara {} dan []?

{} tampaknya akan digunakan untuk investasi blok kode dan hash.

Adalah [] hanya untuk array?

Dalam dokumentasi isn't sangat jelas.

Larutan

Hal ini tergantung pada konteks:

  1. Ketika pada mereka sendiri, atau untuk menetapkan variabel, [] menciptakan array, dan {} menciptakan hash. misalnya

a = [1,2,3] # array b = {1 => 2} # hash

  1. [] dapat diganti sebagai sebuah metode khusus, dan umumnya digunakan untuk mengambil hal-hal dari hash (standar perpustakaan set up [] sebagai metode hash yang sama seperti ambil)
    Ada juga sebuah konvensi yang digunakan sebagai metode kelas dengan cara yang sama anda mungkin menggunakan statis Membuat metode dalam C# atau Java. misalnya

a = {1 => 2} # membuat hash misalnya menempatkan[1] # sama seperti.fetch(1), akan mencetak 2

Hash[1,2,3,4] # ini adalah custom metode kelas yang menciptakan hash baru

Melihat Ruby Hash docs untuk yang contoh terakhir.

  1. Ini mungkin adalah yang paling rumit - {} juga sintaks untuk blok, tapi hanya ketika dilewatkan ke metode di LUAR argumen parens.

Ketika anda memanggil metode tanpa parens, Ruby terlihat di mana anda menempatkan koma untuk mencari tahu di mana argumen yang akhir (di mana parens akan telah telah anda mengetik mereka)

1.upto(2) { puts 'halo' } # it's blok 1.upto 2 { puts 'halo' } # kesalahan sintaks, ruby dapat't tahu di mana fungsi args end 1.upto 2, { puts 'halo' } # koma berarti "argumen", begitu ruby melihatnya sebagai hash ini tidak't bekerja karena menempatkan 'halo' isn't hash yang valid

Komentar (3)

Yang lain, tidak begitu jelas, penggunaan [] adalah sebagai sinonim untuk Proc#call dan Metode#call. Ini mungkin akan sedikit membingungkan saat pertama kali anda temui itu. Saya kira rasional di balik itu adalah bahwa hal itu membuatnya terlihat lebih seperti normal fungsi panggilan.

E. g.

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
Komentar (1)

Secara garis besar, anda're yang benar. Serta hash, gaya umum adalah bahwa kurung kurawal {} yang sering digunakan untuk blok yang dapat masuk semua ke dalam satu baris, bukan menggunakan do/end di beberapa baris.

Tanda kurung siku [] yang digunakan sebagai metode kelas banyak kelas Ruby, termasuk String, BigNum, Dir dan cukup membingungkan, Hash. Jadi:

Hash["key" => "value"]

hanya berlaku sebagai:

{ "key" => "value" }
Komentar (0)

Tanda kurung [ ] digunakan untuk menginisialisasi array. Dokumentasi untuk penginisialisasi kasus [ ] di

ri Array::[]

Tanda kurung kurawal { } digunakan untuk menginisialisasi hash. Dokumentasi untuk penginisialisasi kasus { } di

ri Hash::[]

Tanda kurung juga sering digunakan sebagai metode dalam banyak inti ruby kelas, seperti Array, Hash, String, dan lain-lain.

Anda dapat mengakses daftar dari semua kelas yang memiliki metode "[ ]" didefinisikan dengan

ri []

sebagian besar metode ini juga memiliki "[ ]=" metode yang memungkinkan untuk menetapkan hal-hal, misalnya:

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

Kurung kurawal juga dapat digunakan sebagai pengganti dari "jangan ... end" di blok, seperti "{ ... }".

Kasus lain dimana anda dapat melihat tanda kurung atau tanda kurung kurawal digunakan - lebih di khusus penginisialisasi di mana setiap simbol dapat digunakan, seperti:

%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"
Komentar (0)

beberapa contoh:

[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
Komentar (1)

Perhatikan bahwa anda dapat menentukan [] metode untuk anda sendiri kelas:

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

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

end
Komentar (1)