1

これが、入力された素敵なハッシュを返す理由を理解しようとしています:

 Hash[*myString.split("\n")]

これは空のハッシュを返しますが?

 Hash[myString.split("\n")]

アスタリスクがキーであり、可変長引数を意味することがわかります...しかし、Hash[...]の要件の1つは、偶数の配列を取り、それを有効なハッシュに変換できることです。上記の 2 番目の例では、新しい行の string.split が偶数の配列を返しているのに、なぜ Ruby はそれを許可しないのでしょうか?

4

2 に答える 2

3

これは、splat*文字が配列全体を渡すのではなく、個々の要素に配列を展開するためです。Ruby 2.0ハッシュのドキュメントから:

Hash["a", 100, "b", 200]             #=> {"a"=>100, "b"=>200}
Hash[ [ ["a", 100], ["b", 200] ] ]   #=> {"a"=>100, "b"=>200}
Hash["a" => 100, "b" => 200]         #=> {"a"=>100, "b"=>200}

メソッドを使用して要素を渡すと、Hash[]期待どおりにハッシュがフォーマットされます。それと比較して

Hash[ Array.new ]

基本的に奇数の引数を与えているため、適切なハッシュにマップされないため、空のハッシュが返されます。

于 2013-07-06T00:31:52.000 に答える
1

既存の回答に完全に同意しますが、この場合にスプラットが必要な理由を明確にするより明確な例を次に示します。

test_string = "my\ntest\nstring"

[test_string.split("\n")]  #=> [["my", "test", "string"]]
[*test_string.split("\n")] #=> ["my", "test", "string"]

ご覧のとおり、スプラットなしHash[]では、複数の引数ではなく、単一の引数 (配列) を指定しています。

于 2013-07-06T00:37:12.653 に答える