14

[]Ruby では角かっこの構文にかなり出くわしていますが、同じことをしているようには見えません。Rubyの角括弧のさまざまな用途をすべて挙げて[]、この無限に用途が広いように見える小さな記号を理解できる人はいますか? (Ruby インタープリターが混乱することなく、1 つのシンボルでこれほど多くのことができるのはどうしてでしょうか?)

例:

  • [][]=メソッド
  • %q[...]
  • [1,2,3][0]
  • hash["a"] = 3
  • ary = []
  • /[^A-Fa-f0-9]/
  • "Is a string"[5,3]
4

3 に答える 3

12

角括弧は、2 つの厳密なコンテキストと 1 つのオプションのコンテキストにあります。

配列の定義 配列
、つまり要素の順序付きリストを提供するデータ構造は、 のような構文を使用してコードで指定できます[1,2,3]1これにより、 、2、およびの 3 つの要素3が正確にその順序で配列が作成されます。each次に、またはのようなイテレータ関数を使用して配列を反復処理するかmap、以下に示すようにインデックス ID で特定の要素に直接アクセスできます。

配列とハッシュの要素へのアクセス
ハッシュ (他の言語ではハッシュマップ、辞書、または連想配列とも呼ばれる) には、配列と同様の要素も含まれます。は、データを順不同で保存する方法がこれとは異なります。データは、配列の場合のように整数 ID ではなく、任意のキー (通常はシンボルまたは文字列) でアクセスされます。これは、同じ配列タイプが両方に使用される PHP などとは異なります。

このデータへのアクセスは、ハッシュと配列の両方で[]呼び出されるメソッドによって容易になります。[]=

my_array = [:a, :b, :c]
second_element = my_array[1]
# => :b
# notice that the first element in arrays always has the index 0

my_hash = {:a => 1, :b => 2, :c => 3}
element_of_b = my_hash[:b]
# => 2

これはブラケットの一般的な使用例です。Ruby コードでは、ブラケット関数を実装する他のクラスを見かけることがあります。それらは、配列またはハッシュのいずれかと同様のアクセスを許可するためにそうします。一般に、これらのクラスはそれらと同様に動作することが期待されますが、これは決して強制されません。ダックタイピングも参照してください。

% 記法
Ruby には、一般的なものとは別に、文字列 (およびその他のオブジェクト) を作成するための 3 番目の構文があります。この構文を使用すると、コード内のリテラル文字列は特殊な区切り文字で囲まれていない"か、使用されています。'パーセント記号、作成するオブジェクトを指定する単一の文字、および区切り文字として選択するほとんどすべての文字で始まります。

a = %w[foo bar baz]
b = %w{foo bar baz}
c = %wxfoo bar bazx
d = ["foo", "bar", "baz"]

3 つの例はすべて同じ配列を作成します。この構文の使用方法と、Ruby で使用できるその他の修飾文字については、いくつかのドキュメントを参照してください。

ここではブラケットを使用するのが一般的ですが、必須ではなく、必要に応じて置き換えることができます。この表記法の最も一般的な使用法は、(上記のように) 空白で区切られた文字列から要素の配列を作成することです。このように、括弧を使用すると、構文が基本的な配列指定に似ているため、配列が返されることがさらに明確になります。

于 2012-06-04T07:22:14.750 に答える
12

さて、私自身のメモのために、私はこれを詳しく調べて、ホルガー・ジャストの答えに基づいて、次のことを考え出しました:Rubyでの角括弧の使用は6つの用途に分けることができ、そのうちの3つは一部ですRuby のメソッド定義の 1 つと、そのうちの 3 つのセマンティック コンストラクト。

メソッド定義

クラス メソッド Array::[]、Hash::[] によるオブジェクトの作成

Array.[](1,2,3) #=> [1,2,3]                        #Un-sugared notation
Array["a","b","c"] #=> ["a","b","c"]               #Sugared equivalent
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}  

同じことを行いますが、リテラル コンストラクターとは関係ありません。

インスタンスメソッドによる要素参照 Array#[]、Bignum#[]、Continuation#[]、Fixnum#[]、Hash#[]、MatchData#[]、Method#[]、Proc#[]、String#[]、 Struct#[]、Symbol#[]、Thread#[]、およびクラス メソッド Dir::[]、ENV::[]

ary = [1,2,"abc", [15,16,[26,27]]]  
ary.[](2) #=> "abc"                #Un-sugared notation
ary[2] #=> "abc"                   #Sugared equivalent
ary[0,2] #=> [1,2]  
ary[3][2][1] #=> 26  
[1,2,3][0] #=> 1  
"Is a string"[7,3] #=> "rin"  

インスタンス メソッド Array#[]=、Hash#[]=、String#[]=、Struct#[]=、Thread#[]=、およびクラス メソッド ENV::[]= による要素の割り当て

ary = [1,2,3]  
ary.[]=(1,"abc") #=> [1,"abc",3]    #un-sugared notation
ary[2] = "def" #=> [1,"abc","def"]  #Sugared equivalent
hash = {"a"=>1, "b"=>2}  
hash["a"] = 3 #=> {"a"=>3, "b"=>2}  

セマンティック構造

配列リテラル コンストラクターによるオブジェクトの作成

ary = []  

Ruby には、(通常は) 単純なシンボルのペアを使用して関連するクラスのオブジェクトを作成する一連のリテラル コンストラクターがあり、角括弧は配列オブジェクトのリテラル コンストラクターです: Array []、 Hash {}、 Proc ->(){}、 Range .....、 Regexp //、文字列""''、記号::""

% 表記によるオブジェクトの作成

%q[hello there you] #=> "hello there you"           # String % notation  
%w[hello there you] #=> ["hello", "there", "you"]   # Array % notation  

厳密には角括弧表記ではなく、必要に応じて角括弧を使用できる 2 記号対表記です。同様%q@hello there you@に有効です。

Rubyの正規表現

/[^A-Fa-f0-9]/  

角括弧は、Ruby 正規表現の文字クラスを示します。

Dir::glob メソッドで使用するパターンとして ,の別の使用法を見つけ[]ましたが、正規表現とまったく同じように動作するはずです。それでも、Ruby の 1500 以上のメソッドには、さらに多くの用途が隠されている可能性があることを示しています。

于 2012-06-07T14:27:38.320 に答える