Ruby'deki farklı parantezler ne anlama geliyor?


85

Ruby'de {}ve arasındaki fark []nedir?

{} hem kod blokları hem de karmalar için kullanılıyor gibi görünüyor.

Are []sadece diziler için?

Belgeleme pek net değil.

Yanıtlar:


72

Bu koşullara bağlıdır:

  1. Kendi başlarına veya bir değişkene []atandığında, diziler {}oluşturur ve karmalar oluşturur. Örneğin

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. []Özel bir yöntem olarak geçersiz kılınan olabilir ve genellikle sağlamalarının şeyler almak için kullanılıyor (standart kütüphane kurar []aynıdır sağlamalarının bir yöntem olarak fetch)
    aynı Sınıf yöntemi olarak kullanıldığını bir kongre de vardır static CreateC # veya Java'da bir yöntemi kullanmanın yolu . Örneğin

    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
    

    Bu son örnek için Ruby Hash belgelerine bakın .

  3. Bu muhtemelen en zor olanıdır - {}aynı zamanda bloklar için sözdizimidir, ancak yalnızca bir yönteme arguments parens DIŞINDA geçildiğinde.

    Parantezler olmadan yöntemleri çağırdığınızda, Ruby argümanların nerede bittiğini bulmak için virgülleri nereye koyduğunuza bakar (parenlerin nerede olacağı, siz yazmış olsaydınız)

    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
    

2
yan not: Karma # getirme tam olarak Karma # [] değildir. {: a => 1,: b => 2} .fetch (: c) IndexError: anahtar bulunamadı
tokland

@tokland :cbulunamadı
yyny

"Ayrıca, C # veya Java'da statik bir Create yöntemini kullanabileceğiniz gibi, bir sınıf yöntemi olarak kullanıldığına dair bir kural da vardır." Bu tam olarak aradığım cevap. Ayrıca Ruby hakkında en çok nefret ettiğim şeyin klasik bir örneği; Ruby kodunu okumak için tonlarca belirsiz küçük numarayı bilmeniz gerekir.
Tony

22

Çok açık olmayan başka bir kullanım, []Proc # çağrısı ve Yöntem # çağrısının eşanlamlısıdır. Bununla ilk karşılaştığınızda biraz kafa karıştırıcı olabilir. Sanırım arkasındaki mantık, normal bir işlev çağrısı gibi görünmesini sağlaması.

Örneğin

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

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

9

Genel anlamda haklısın. Karmalara ek olarak, genel stil, küme parantezlerinin {}genellikle birkaç satır arasında do/ kullanmak yerine tümünü bir satıra sığdırabilen bloklar için kullanılmasıdır end.

Köşeli parantezler []String, BigNum, Dir ve kafa karıştırıcı bir şekilde Hash dahil olmak üzere birçok Ruby sınıfında sınıf yöntemi olarak kullanılır. Yani:

Hash["key" => "value"]

şu kadar geçerlidir:

{ "key" => "value" }

3

Köşeli parantezler [] dizileri başlatmak için kullanılır. [] Başlatıcı durumu için belgeler şurada

ri Array::[]

Küme parantezleri {}, karmaları başlatmak için kullanılır. {} Başlatıcı durumu için belgeler şurada

ri Hash::[]

Köşeli parantezler ayrıca Array, Hash, String ve diğerleri gibi birçok çekirdek yakut sınıfında bir yöntem olarak yaygın olarak kullanılır.

"[]" Yönteminin tanımlandığı tüm sınıfların listesine erişebilirsiniz.

ri []

çoğu yöntemin, bir şeyleri atamaya izin veren bir "[] =" yöntemi vardır, örneğin:

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

Bloklarda "{...}" gibi "do ... end" yerine kıvrımlı parantezler de kullanılabilir.

Köşeli parantezleri veya süslü parantezleri görebileceğiniz başka bir durum, herhangi bir sembolün kullanılabileceği özel başlatıcılardadır, örneğin:

%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"

2

birkaç örnek:

[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

[]Kendi sınıflarınız için yöntemi tanımlayabileceğinizi unutmayın :

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

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

end

1
Nedir @rank.?
FeifanZ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.