简单的哈希由ruby中的键和值数组合并(使用perl示例)

ger*_*ime 7 ruby arrays hash variable-assignment

在Perl中,基于键和值数组执行哈希更新,我可以执行以下操作:

@hash{'key1','key2','key3'} = ('val1','val2','val3');
Run Code Online (Sandbox Code Playgroud)

在Ruby中,我可以用更复杂的方式做类似的事情:

hash.merge!(Hash[ *[['key1','key2','key3'],['val1','val2','val3']].transpose ])
Run Code Online (Sandbox Code Playgroud)

好的,但我怀疑这种程序的有效性.

现在我想在一行中完成更复杂的任务.

Perl示例:

(@hash{'key1','key2','key3'}, $key4) = &some_function();
Run Code Online (Sandbox Code Playgroud)

我不知道这种东西是否可以用一些简单的Ruby方式实现.任何提示?

对于Perl受损,@hash{'key1','key2','key3'} = ('a', 'b', 'c')是一个哈希切片,并且是这样的简写:

$hash{'key1'} = 'a';
$hash{'key2'} = 'b';
$hash{'key3'} = 'c';
Run Code Online (Sandbox Code Playgroud)

jtb*_*des 3

您可以重新定义[]=以支持这一点:

class Hash
  def []=(*args)
    *keys, vals = args # if this doesn't work in your version of ruby, use "keys, vals = args[0...-1], args.last"
    merge! Hash[keys.zip(vals.respond_to?(:each) ? vals : [vals])]
  end
end
Run Code Online (Sandbox Code Playgroud)

现在使用

myhash[:key1, :key2, :key3] = :val1, :val2, :val3
# or
myhash[:key1, :key2, :key3] = some_method_returning_three_values
# or even
*myhash[:key1, :key2, :key3], local_var = some_method_returning_four_values
Run Code Online (Sandbox Code Playgroud)