2011-10-09 9 views
5

私はRubyの基礎を学んでいます(ちょうど出発)、私はHash.[] methodを見つけました。それは少し考えでRubyの構文砂糖には「ルール」がありますか?

a = ["foo", 1, "bar", 2] 
=> ["foo", 1, "bar", 2] 
Hash[*a] 
=> {"foo"=>1, "bar"=>2} 

で導入されました、私はHash[*a]Hash.[](*a)またはHash.[] *aと等価であることを考え出しました。私の疑問がなぜそうなのでしょうか? *aを角括弧の中に入れることができるのは何ですか、そしてどこで、いつ他の "それ"を使うことができるかというルールがありますか?

編集:私の言い回しは、混乱を招くようです。私は配列の拡張について尋ねていません。私はそれを得る。私の質問は基本的に:[]がメソッド名の場合、大括弧の中に引数を入れても大丈夫ですか?あなたがメソッドFoo.doodを持っていて、それに"hey"という文字列を渡したければ、Foo.do"hey"odと書くことができると言っているように思えます。

+0

私はメソッド呼び出しで '* a'に焦点を当てたたくさんの答えを見ています。しかし、 '' [1、* a] 'が' '[1、a]'とは異なる結果をもたらすように、なぜ期待通りに動作するのか、 1] 'が無効です。 "splat"が代入にどのように関係しているのか、それがRubyの代入分解とどのようにやりとりできるかを見てうれしいでしょう。おそらく間違いなく別のSOの質問;-)準形式的なルビ仕様。準仕様へのリンクは、より良い答えになります。 –

+0

@pst:良い質問。あなたがそれについて新しいSOの質問をする場合、私はそれに従うことができるようにここにリンクを投稿してください。 –

+0

通常の方法では、ペアの配列を送信することです:Hash [[[key1、value1]、[key2、value2]] – tokland

答えて

3

ルビーは、あなたが特別に呼び出すことができますカップルの方法がありますでしょう

Hash[*a]に似ています方法。あなたが言及した通り[]+-==などです。もう1つの重要な例はobject.something = valueで呼び出すことができ、アクセサーを作成できるようにするsomething=(value)という形式のメソッドです。

編集:

楽しい事実1:あなたは+メソッドを定義する場合は、あなたが自由のため+=を取得します。

楽しい事実2:あなたは、すべての比較方法、Comparable

+0

この「特別な」もののどこかにリストがありますか? –

+1

私見不要なdownvoteに対抗するために存在し無効にすることができる演算子の一覧は[こちら](http://www.zenspider.com/Languages/Ruby/QuickRef.html#28)である –

4

Hash["a", "b", "c", "d"]Hash.[]("a", "b", "c", "d")に相当します。 Rubyのほとんどすべてがメソッド呼び出しです。 5 + 55.+(5)に相当します。

a = ["a", "b", "c", "d"]Hash[*a]Hash["a", "b", "c", "d"]と等価であり、Hash.[]("a", "b", "c", "d")と等価です。同様に、foo(*a)foo("a", "b", "c", "d")に相当します。これは、explode演算子と呼ばれ、配列をメソッドに送り、メソッドの最初の引数として配列を送信するのではなく、配列の各項目をメソッドの1つの引数として数えます。


特にあなたの更新に答えるために、あなたは括弧の中*aを置くことができます特別なことは何もありません。大括弧は通常のメソッド呼び出しのための砂糖です。ここで唯一の特別なことは、どの方法にでも*aを送ることができることです。

+0

したがって、[すべて]スプラット拡張が許可される場所は何ですか? (メソッド呼び出しAFAIKに関連しない少なくとももう1つはあります。) –

+0

更新?私は何も更新していない。ですから、大括弧がメソッド名としてRubyで発生する場所であれば、引数リストを入れるためにかっこのかわりにかっこを使うことができますか?私は古いメソッド 'Foo。[]'を使って、引数a、b、cを 'Foo [a、b、c]'と書くことができますか?それは単なる魔法の言語機能ですか? –

+0

それは正しいです。 []という名前のメソッドは、 'my_obj [foo]'という砂糖で呼び出すことができます。 [] =メソッドは、 'my_obj [foo] = bar'で呼び出すことができます。これは 'my_obj。[] =(foo、bar)'に変換されます。これが 'Hash'インスタンスの構文を強化します。 'Dir [glob pattern"] 'Dir。[](" globパターン ")に変換する' Dir [globパターン "]もあります。 –

0

*<Array>メソッドは、配列を配列として取るのではなく、 'expanded'配列を使用するように指示します。

例:test(a)

def test(*argv) 
    p argv 
end 

a = [1,2,3] 
test(a) #-> [[1, 2, 3]] 
test(*a) #-> [1, 2, 3]  

配列aは唯一パラメータです。

test(*a)では、パラメータのリストとしてaが使用されます。


あなたの場合

a = ["foo", 1, "bar", 2] 
Hash[*a] 

Hash[["foo", 1, "bar", 2]] 
+0

これは許可されているかどうかはどこですか? (例えば、制作ルールは何ですか?) –

+0

あなたがそれを使用する方法に依存します。 'a'は一つの配列、' * a'はパラメータのリストです。ですから、問題は '* a'が許されているのではなく、:配列としてパラメータを必要とするか、パラメータリストが必要ですか? – knut

+0

私の質問は、配列の拡張に関するものではありません。それは '[]'メソッドに関するもので、具体的にはそれらの括弧の中に引数を入れても大丈夫です。 –

2

の礼儀を得る<=>を定義した場合、私はRubyの構文がYARV Ruby用parse.yに定義されていると思います。

+0

+1。 –

関連する問題