Pertanyaan Apa arti tanda kurung yang berbeda di Ruby?


Di Ruby, apa bedanya {} dan []?

{} tampaknya digunakan untuk kedua blok kode dan hash.

Adalah [] hanya untuk array?

Dokumentasi tidak begitu jelas.


76
2017-08-15 18:09


asal


Jawaban:


Itu tergantung pada konteksnya:

  1. Ketika mereka sendiri, atau menugaskan ke variabel, [] membuat array, dan {} membuat hash. misalnya

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] dapat ditimpa sebagai metode khusus, dan umumnya digunakan untuk mengambil barang dari hash (kumpulan pustaka standar [] sebagai metode pada hash yang sama fetch)
    Ada juga konvensi yang digunakan sebagai metode kelas dengan cara yang sama Anda mungkin menggunakan static Create metode di C # atau Java. misalnya

    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
    

    Lihat Ruby Hash docs untuk contoh terakhir itu.

  3. Ini mungkin yang paling sulit - {} juga sintaks untuk blok, tetapi hanya ketika dilewatkan ke metode LUAR argumen parens.

    Ketika Anda memanggil metode tanpa parens, Ruby melihat di mana Anda meletakkan koma untuk mencari tahu di mana argumen berakhir (di mana parens itu, apakah Anda sudah mengetiknya)

    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
    

67
2017-08-17 21:17



Lain, tidak begitu jelas, penggunaan [] adalah sebagai sinonim untuk panggilan Proc # dan Metode # panggilan. Ini mungkin sedikit membingungkan saat pertama kali Anda menemukannya. Saya kira yang rasional di balik itu adalah itu membuatnya terlihat lebih seperti panggilan fungsi normal.

Misalnya.

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

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

19
2018-04-02 15:47



Secara garis besar, Anda benar. Serta hash, gaya umum adalah kurung kurawal {} sering digunakan untuk blok yang bisa muat semua ke satu baris, daripada menggunakan do/end melintasi beberapa garis.

Kurung kotak [] digunakan sebagai metode kelas dalam banyak kelas Ruby, termasuk String, BigNum, Dir dan cukup membingungkan, Hash. Begitu:

Hash["key" => "value"]

sama validnya dengan:

{ "key" => "value" }

9
2017-08-15 18:24



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

ri Array::[]

Kurung kurawal {} digunakan untuk menginisialisasi hash. Dokumentasi untuk kasus initializer {} sudah masuk

ri Hash::[]

Tanda kurung siku juga biasa digunakan sebagai metode di banyak kelas ruby ​​inti, seperti Array, Hash, String, dan lainnya.

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

ri []

kebanyakan metode 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 "lakukan ... berakhir" di blok, seperti "{...}".

Kasus lain di mana Anda dapat melihat tanda kurung siku atau kurung kurawal yang digunakan - adalah di penginisialisasi khusus di mana simbol apa pun 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"

3
2017-09-17 07:52



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

2
2017-08-15 19:03



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

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

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

end

2
2017-10-13 21:47