86

{}Rubyでは、との違いは何[]ですか?

{}コードブロックとハッシュの両方に使用されているようです。

[]アレイ専用ですか?

文書化はあまり明確ではありません。

4

6 に答える 6

74

それは文脈に依存します:

  1. 単独で、または変数に割り当てると、[]配列が作成され、{}ハッシュが作成されます。例えば

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. []カスタムメソッドとしてオーバーライドでき、一般的にハッシュから物をフェッチするために使用されます(標準ライブラリはハッシュのメソッドとして設定さ[]れます。これはと同じですfetch)同じ
    クラスメソッドとして使用されるという規則もあります。static CreateC#または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ハッシュのドキュメントを参照してください。

  3. これはおそらく最もトリッキーなものです- {}ブロックの構文でもありますが、引数の範囲外のメソッドに渡された場合のみです。

    パーレンなしでメソッドを呼び出すと、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
    
于 2008-08-17T21:17:44.680 に答える
23

もう 1 つの、それほど明白ではない使用方法は[]、Proc#call と Method#call の同義語です。これは、最初に遭遇したときは少し混乱するかもしれません。その背後にある合理的な理由は、通常の関数呼び出しのように見えるからだと思います。

例えば

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
于 2009-04-02T15:47:21.460 に答える
9

大まかに言えば、あなたは正しいです。ハッシュと同様に、一般的なスタイルでは、複数の行に/を{}使用する代わりに、すべてを1つの行に収めることができるブロックに中括弧がよく使用されます。doend

角かっこ[]は、String、BigNum、Dir、および紛らわしいことにHashを含む多くのRubyクラスのクラスメソッドとして使用されます。それで:

Hash["key" => "value"]

と同じくらい有効です:

{ "key" => "value" }
于 2008-08-15T18:24:06.933 に答える
3

角括弧[]は、配列を初期化するために使用されます。[]のイニシャライザケースのドキュメントは

ri Array::[]

中括弧{}は、ハッシュを初期化するために使用されます。{}の初期化子の場合のドキュメントは

ri Hash::[]

角かっこは、Array、Hash、Stringなどの多くのコアrubyクラスのメソッドとしても一般的に使用されます。

メソッド「[]」が定義されているすべてのクラスのリストにアクセスできます。

ri []

ほとんどのメソッドには、次のようなものを割り当てることができる「[]=」メソッドもあります。

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

ブロックの「do...end」の代わりに、「{...}」のように中括弧を使用することもできます。

角かっこまたは中かっこが使用されていることを確認できるもう1つのケースは、次のような任意の記号を使用できる特別な初期化子です。

%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"
于 2008-09-17T07:52:50.970 に答える
2

いくつかの例:

[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
于 2008-08-15T19:03:12.893 に答える
2

[]独自のクラスのメソッドを定義できることに注意してください。

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

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

end
于 2009-10-13T21:47:50.233 に答える