6

splat 演算子を使用して配列を分解できます。

def foo(arg1, arg2, arg3)
  #...Do Stuff...
end
array = ['arg2', 'arg3']
foo('arg1', *array)

しかし、オプションタイプの良さのためにハッシュを破壊する方法はありますか?

def foo(arg1, opts)
  #...Do Stuff with an opts hash...
end
opts = {hash2: 'bar', hash3: 'baz'}
foo('arg1', hash1: 'foo', *opts)

ネイティブの Ruby ではない場合、Rails はこのようなものを追加しましたか?

現在、私は大まかにこれをやっています

foo('arg1', opts.merge(hash1: 'foo'))
4

4 に答える 4

6

はい、ハッシュを分解する方法があります。

def f *args; args; end
opts = {hash2: 'bar', hash3: 'baz'}
f *opts  #=> [[:hash2, "bar"], [:hash3, "baz"]]

問題は、あなたが望むものは実際にはまったく構造化されていないということです。あなたはそこから行こうとしています

'arg1', { hash2: 'bar', hash3: 'baz' }, { hash1: 'foo' }

'arg1', foo: 'bar'(これは単に の省略形であることを思い出してください'arg1', { foo: 'bar' })

'arg1', { hash1: 'foo', hash2: 'bar', hash3: 'baz' }

これは、定義上、マージです (周囲の構造 (ハッシュ) がまだそこにあることに注意してください)。一方、脱構造化は

'arg1', [1, 2, 3]

'arg1', 1, 2, 3
于 2013-03-03T22:39:48.187 に答える
3

そのようなことはありません(提案されていますが)。これは構文解析規則を変更するため、Ruby 内で実装することはできません。私が考えることができる最善の方法は、次のよう*にハッシュで定義することです

class Hash; alias :* :merge end

次のいずれかの方法で使用します。

foo('arg1', {hash1: 'foo'}*opts)
foo('arg1', {hash1: 'foo'} *opts)
foo('arg1', {hash1: 'foo'}. *opts)

最後のものは、あなたが望んでいたものにかなり近いと思います。

于 2013-03-03T22:35:23.820 に答える