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)
您可以重新定义[]=以支持这一点:
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)